【发布时间】:2018-02-12 14:17:50
【问题描述】:
看这个例子(取自here):
class foo {
std::string my_str_;
public:
std::string_view get_str() const {
return my_str_.substr(1u);
}
};
这段代码不好,因为substr返回一个临时的std::string,所以返回的std::string_view指的是一个已经被销毁的对象。但是,如果substr返回std::string_view,就不会存在这个问题了。
此外,如果substr 返回std::string_view 而不是std::string,对我来说似乎是合乎逻辑的,因为返回的字符串是字符串的视图,而且性能更高,因为没有复制。
如果substr 返回std::string_view 是否会有任何缺点(除了明显的缺点:失去与 C++14 的一些兼容性 - 我并没有低估这一点的重要性,我只是想知道是否还有其他缺点存在)?
相关问题:How to efficiently get a `string_view` for a substring of `std::string`
【问题讨论】:
-
string_view是一个相对较新的东西,标准必须保持向后兼容性。 -
会
std::string_view sv = my_str_; return sv.substr(1u);帮忙吗? -
@DevNull:是的,它解决了问题。但是我想知道如果
substr返回std::string_view的缺点(除了明显提到的缺点)。在某些情况下,“转换”为std::string_view可能会自动发生(例如:std::string::substr可以返回它)。 -
对于期望临时字符串的人来说,您会遇到相反的问题,可能会将其传递给 C 函数
f(my_str.substr(1,5).c_str());。 -
为什么要坚持改变现有的方法签名而不是引入一个新的,例如
substringview让大家开心?