在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)
也不适用于后者吗?
答案 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说它必须以空值终止。