【发布时间】:2014-07-31 20:47:29
【问题描述】:
讨论
已知从 C++11 及以后的
std::basic_strings 被认为具有空字符终止的内部存储缓冲区。除其他外,此更改的主要原因是
std::basic_string的先前定义仅允许对字符串进行非常有限的并发访问,因此限制了多线程应用程序的性能。 (更多std::basic_string变化的原因可以阅读proposal N2534)。但是,阅读标准时,我找不到明确指出
std::basic_string必须有一个以空字符结尾的内部存储缓冲区的引用。我发现的唯一隐式引用是§21.4.7.1/1&3 basic_string accessors [string.accessors]:
const charT* c_str() const noexcept;
const charT* data() const noexcept;
1返回:一个指针p,使得p + i == &operator[](i)对应[0,size()]中的每个i。3要求:程序不得更改存储在字符数组中的任何值。
我假设由于效率原因,并且由于
§21.4.7.1/3要求程序不得更改返回的缓冲区,std::basic_string::c_str()和std::basic_string::data()中的大多数实现者都返回以空字符结尾的内部缓冲区。
1234563 /p>
问题:
- 标准中是否有明确规定
std::basic_string内部存储缓冲区必须以空字符结尾? - 如果没有明确的声明(即,问题 #1 的简短回答是否定的),这是否意味着实施者可以在没有空字符终止的内部存储缓冲区的情况下实施
std::basic_string,从而广泛传播概念既然 C++11 字符串是空终止的,那是错误的吗?
【问题讨论】:
-
部分原因也在于它们的复杂性。
-
我还隐约记得至少有一个
std::string操作可以显式取消引用但不能提前end迭代器。 -
阅读副本的答案后,我得出的结论是,没有针对空终止缓冲区的显式指令,但这是隐式强制的。还是我错了?
标签: c++ c++11 language-lawyer stdstring c++14