看这个例子(摘自这里):
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的一些兼容性 - 我并不低估这一点,只是想知道是否存在其他缺点)?
相关问题:如何有效地获取std::string子串的string_view
string_view
是一个相对较新的东西,标准必须保持向后兼容性。 - The Quantum Physiciststd::string_view sv = my_str_; return sv.substr(1u);
会有帮助吗? - Dev Nullsubstr
返回std::string_view
会有什么缺点(除了明显提到的缺点)。在某些情况下,“转换”为std::string_view
可能会自动发生(例如此案例:std::string::substr
可以返回它)。 - gezaf(my_str.substr(1,5).c_str());
。 - Bo Perssonsubstringview
,让大家都感到满意呢? - W.F.substr()
分开实现时才是有效的。 - Justin Time - Reinstate Monica