在C++ 11中,std :: string总是以null结尾吗?

lin*_*s77 44 c++ string null-terminated language-lawyer c++11

在他的网站2008年的一篇文章中,Herb Sutter声明如下:

由于与并发相关的原因,有一个积极的建议是在C++ 0x中进一步加强这一点并且需要空终止并且可能禁止写时复制实现.以下是该文件:http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2008/n2534.html.我认为本文中的一个或两个提案很可能会被采纳,但我们将在下一个或两个会议上看到.

我知道C++ 11现在保证std :: string内容连续存储,但他们是否在最终草案中采用了上述内容?

现在使用类似的东西会安全&str[0]吗?

Jam*_*lis 49

是.根据C++ 0x FDIS 21.4.7.1/1,std::basic_string::c_str()必须返回

一个指针p,p + i == &operator[](i)每个iin [0,size()].

这意味着给定一个字符串s,返回的指针s.c_str()必须与string(&s[0])中的初始字符的地址相同.

  • @AndrewMarshall:`operator []`需要返回对实际存储元素的引用,因此(21.4.7.1/1)也应用了`operator [str.length()]`中的元素必须属于存储. (21认同)
  • 这似乎没有回答帖子标题的问题 - 即"Will`std :: string`在C++ 11中总是以null结尾?",在这种情况下答案是否定的.`operator [str.length()]`将返回''\ 0'`,但这并不意味着`string`实际上在内存中包含它. (14认同)
  • 是的,它表明`basic_string <> :: c_str()`和`basic_string <> :: data()`现在具有完全相同的语义. (7认同)
  • 请注意,对于`data`,同样的要求也适用,我认为对于C++ 98/03来说并非如此. (4认同)