为什么不支持串联std :: string和std :: string_view?


76

从C ++ 17开始,我们可以std::string_view轻松查看连续的字符序列,从而避免了不必要的数据复制。const std::string&现在通常建议使用而不是有参数来代替std::string_view

但是,人们很快发现,从切换const std::string&std::string_view使用字符串连接的代码会中断,因为不支持连接std::stringstd::string_view

std::string{"abc"} + std::string_view{"def"}; // ill-formed (fails to compile)
std::string_view{"abc"} + std::string{"def"}; // ill-formed (fails to compile)

为什么要为串联不支持std::stringstd::string_view标准?


14
最有可能是疏忽。也就是说,添加aoperator +可以使代码正常工作。
NathanOliver

8

2
我还想念的是std :: basic_string的成员函数,该成员函数返回子字符串的std :: basic_string_view(类似于“ substr”成员函数),可能名为“ substr_view”。
CAF

Answers:


43

原因是在n3512 string_ref中给出的 Jeffrey Yasskin修订版2中对字符串的非所有权引用

我还省略了operator +(basic_string,basic_string_ref),因为LLVM从此重载中返回轻量级对象,并且仅延迟执行串联。如果定义此重载,稍后将很难引入这种轻量级的连接。

后来建议在std-proposals邮件列表中将这些运算符重载添加到标准中。


64
哇。哇!这似乎是遗漏某些东西的最糟糕的可能原因。该标准应该是为了语言的利益而不是为了任何特定的实现。我也对“延迟执行连接”保持警惕-这是否意味着,如果我们内存不足,是否还会推迟添加到原始字符串的异常?我肯定是地狱的希望不是,我想知道,如果操作失败时当我访问结果做到这一点并不十分钟后,。
paxdiablo

4
希望有人提出将这些运营商包括在内的建议。
vitaut

3
fmtlib / fmt库中,可以很好地使用string_view
void.pointer 19'Aug

6
std::basic_string::append()有一个重载,它接受可以隐式转换为的所有内容std::string_view。当然这与operator+()
马特乌斯布兰德

1
如果需要高效的c ++字符串连接(例如,字符串生成器),这里的注释程序会建议哪些替代方法?例如,c#库具有高效的uri_builder类,该类接受一组字符串,并使用to_string()方法创建一个字符串。如果string_view具有+()重载,则可以实现这一点。
bg
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.