C++03 和 C++11 之间 c_str 函数规范的差异

Difference in c_str function specification between C++03 and C++11

c_str() 的 C++ referencestd::string 出现以下内容:

Return value
Pointer to the underlying character storage.
data()[i] == operator[](i) for every i in [0, size()) (until C++11)
data() + i == &operator[](i) for every i in [0, size()] (since C++11)

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

前者的说法data()[i] == operator[](i)不也适用于后者吗?

在 C++11 之前,未指定字符串数据是否以 null 结尾。 C++11 规定它必须以 null 结尾。

注意右括号的区别:

[0, size())

[0, size()]

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

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

除了从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?是。