讨论
std::basic_string以外,它们被认为具有终止于空字符的内部存储缓冲区。std::basic_string的定义只允许对字符串的非常有限的并发访问,从而限制了多线程应用程序的性能。(有关std::basic_string更改原因的更多信息可以在提案N2534中阅读)。std::basic_string必须有一个以空字符结束的内部存储缓冲区。
const charT* c_str() const noexcept;const charT* data() const noexcept;1返回:一个指针p,为[0,size()]__中的每个i提供p + i == &operator[](i)。3要求:程序不应更改字符数组中存储的任何值。
§21.4.7.1/3要求程序不更改返回的缓冲区,std::basic_string::c_str()和std::basic_string::data()中的大多数实现者都返回以空字符结束的内部缓冲区。std::basic_string::c_str()和std::basic_string::data()返回的缓冲区必须是std::basic_string的内部存储缓冲区,而不是以空字符结尾的副本。问题:
std::basic_string内部存储缓冲区必须终止为空字符的地方?std::basic_string,因此,由于C++11字符串为null终止的广泛扩展的概念是错误的?发布于 2014-07-31 20:51:43
从21.4.5
const_reference operator[](size_type pos) const;reference operator[](size_type pos);1要求:pos <= size()。 2返回:如果是*(begin() + pos),则为pos < size(),否则为T类型的对象引用值charT();所引用的值不应被修改。
请注意,s[s.size()]定义良好,需要返回NUL字符。
然而,这本身并不需要NUL-terimnated内部存储。21.4.1/5有这样的说法:
basic_string对象中类似字符的对象将被连续存储.也就是说,对于任何
basic_string对象s,对于n的所有值(如0 <= n < s.size()),标识&*(s.begin() + n) == &*s.begin() + n都应保持。
请注意,连续存储只需要n < s.size(),而不需要s.size()本身。因此,char* p = &s[0];不一定指向NUL-terminated缓冲区,因为标准不要求p[s.size()]是有效的。
实际上,在data()、c_str()和operator[]的需求之间,任何正常的实现都会维护NUL-terminated存储。但是疯狂的实现似乎并没有被标准所阻止。
发布于 2014-07-31 20:52:17
在C++11中,c_str()和data()都需要返回指向内部存储的指针(对不起,我没有现成的直接引号来支持这一点)。在早期版本中,c_str()不需要这样做,但data()需要这样做。实现者可以(但很少)实现写上复制语义,因此c_str()返回的指针不是原始的内部存储。
在所有版本中,c_str()都需要返回一个以空结尾的指针.因此,这意味着在C++11中,内部存储必须为空终止。
https://stackoverflow.com/questions/25068637
复制相似问题