C ++ 03和C ++ 11之间c_str函数规范的区别

时间:2017-08-20 12:40:33

标签: c++ string c++11 c++03 c-str

c_str()中的std::string的C ++ reference中,出现以下内容:

  

返回值
  指向底层字符存储的指针   data()[i] == operator[](i) for every i in [0, size())(直到C ++ 11)
  data() + i == &operator[](i) for every i in [0, size()](自C ++ 11起)

我不明白两者之间的区别,除了自C ++ 11以来一个元素的范围增加。

后者声明data()[i] == operator[](i)也不适用于后者吗?

3 个答案:

答案 0 :(得分:20)

除了自C ++ 11以来一个元素的范围增量外,它们之间仍存在很大差异:

data()[i] == operator[](i)

data() + i == &operator[](i)

主要区别在于原型中的&运算符。

旧的原型允许在发生写入操作时进行复制,因为返回的指针可能指向另一个缓冲区,而不是保存原始字符串的缓冲区。

data()[i]data() + i之间原型的其他差异并不重要,因为它们是equivalent

C ++和C ++ 11之间的区别在于,在前者中,标准未明确指定std::string是否具有空终止符。然而,在后者中,这是指定的。

换句话说:Will std::string always be null-terminated in C++11?是的。

答案 1 :(得分:9)

请注意右括号差异:

  

[0,size()

     

[0,size()]

首先代表排他范围(即size索引处的项目不包括在内),而第二个代表包含范围(即size索引处的项目) 在C ++之前,在这种情况下不处理终止null的前提,而在C ++ 11中,size()位置的访问字符是明确定义的。

至于data()[i] == operator[](i)data() + i == &operator[](i)之间的差异,第二个对潜在实施施加了更多限制。在第一种情况下,由data()返回的缓冲区的指针可能与缓冲区的指针不同,在缓冲区中存储由operator []返回的引用的值。在调用复制字符串的非const限定operator []之后创建新缓冲区时,可能会发生这种情况。

答案 2 :(得分:0)

在C ++ 11之前,未指定字符串数据是否以空值终止。 C ++ 11说它必须以空值终止。