2011-05-20 38 views
43

在2008年后他的网站上,香草萨特规定如下:std :: string总是以C++ 11为空终止?

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

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

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

+0

保证连续存储的内容也在C++ 03中提供? – triclosan 2013-07-22 15:35:13

回答

45

是的。每的C++ 0x FDIS 21.4.7.1/1,std::basic_string::c_str()必须[0,size()]返回

每个i一个指针p使得p + i == &operator[](i)

这意味着,给定的字符串s,通过s.c_str()返回必须是相同的字符串(&s[0])在初始字符的地址的指针。

+4

请注意,相同的要求适用于'数据',我认为C++ 98/03不适用。 – Xeo 2011-05-20 20:32:28

+6

是的,这表明'basic_string <> :: c_str()'和'basic_string <> :: data()'现在具有完全相同的语义。 – ildjarn 2011-05-20 20:35:11

+14

这似乎没有回答帖子标题的问题 - 即“将'std :: string'永远以C++ 11为空终止?”,在这种情况下答案是否定的。 'operator [str.length()]'会返回''\ 0'',但这并不意味着'string'实际上将它包含在内存中。 – 2013-06-24 16:21:55

相关问题