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

Chi*_*iel 26 c++ string c-str c++11 c++03

在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)对后者来说也不正确吗?

gsa*_*ras 20

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

data()[i] == operator[](i)
Run Code Online (Sandbox Code Playgroud)

和:

data() + i == &operator[](i)
Run Code Online (Sandbox Code Playgroud)

主要区别在于&原型中的操作员.

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

在与原型的另一个区别data()[i]data() + i,并不重要,因为它们是等效的.


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

换句话说:在C++ 11中,std :: string总是以null结尾吗?是.


use*_*670 9

注意右括号的区别:

[0,size())

[0,size()]

第一个代表独占范围(即size索引中的项目不包括在内),而第二个代表包含范围(size包括索引中的项目)在C++之前,在这种情况下不处理终止null的前提,而在C++ 11中在size()位置访问角色是明确定义的.

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