首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >空终止字符串,它真的是由标准规定的吗?

空终止字符串,它真的是由标准规定的吗?
EN

Stack Overflow用户
提问于 2014-07-31 20:47:29
回答 2查看 344关注 0票数 4

讨论

  • 众所周知,从C++11和std::basic_string以外,它们被认为具有终止于空字符的内部存储缓冲区。
  • 这一变化的主要原因之一是,以前对std::basic_string的定义只允许对字符串的非常有限的并发访问,从而限制了多线程应用程序的性能。(有关std::basic_string更改原因的更多信息可以在提案N2534中阅读)。
  • 但是,阅读标准时,我找不到一个引号,其中明确指出std::basic_string必须有一个以空字符结束的内部存储缓冲区。
  • 我发现的唯一隐含引语是§21.4.7.1/1&3 basic_string访问器string.accessors

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的内部存储缓冲区,而不是以空字符结尾的副本。

问题:

  1. 标准中是否有明确规定std::basic_string内部存储缓冲区必须终止为空字符的地方?
  2. 如果没有明确的语句(即问题#1的简短答案是否),这是否意味着一个实现者可以使用一个以空字符结束的内部存储缓冲区来实现std::basic_string,因此,由于C++11字符串为null终止的广泛扩展的概念是错误的?
EN

回答 2

Stack Overflow用户

发布于 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存储。但是疯狂的实现似乎并没有被标准所阻止。

票数 5
EN

Stack Overflow用户

发布于 2014-07-31 20:52:17

在C++11中,c_str()data()都需要返回指向内部存储的指针(对不起,我没有现成的直接引号来支持这一点)。在早期版本中,c_str()不需要这样做,但data()需要这样做。实现者可以(但很少)实现写上复制语义,因此c_str()返回的指针不是原始的内部存储。

在所有版本中,c_str()都需要返回一个以空结尾的指针.因此,这意味着在C++11中,内部存储必须为空终止。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/25068637

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档