26

在下面的 C++参考中出现:c_str()std::string

返回值
指向底层字符存储的指针。
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)也适用于后者吗?

4

3 回答 3

20

除了从 C++11 开始的范围增加一个元素之外,还有一个很大的区别:

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

和:

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

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

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

data()[i]和之间的原型的另一个区别data() + i并不重要,因为它们是等价的。


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

换句话说:std::string 在 C++11 中是否总是以 null 结尾?是的。

于 2017-08-20T12:48:49.867 回答
9

注意右括号的区别:

[0,大小()

[0,大小()]

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

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

于 2017-08-20T12:45:09.933 回答
0

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

于 2017-08-20T12:44:32.933 回答