c++ - C++03和C++11在c_str函数规范上的区别

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

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

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开始范围增加一个元素外,还有很大的区别:

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

和:

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

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

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

data()[i]data() + i 之间原型(prototype)的另一个区别并不重要,因为它们是 equivalent .


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

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

关于c++ - C++03和C++11在c_str函数规范上的区别,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45782237/

相关文章:

c++ - 在整数数组中连续输入

c++ - 强制 MS VS2010 在每次构建时重建一个 cpp 文件

arrays - 将字节数组转换为十六进制字符串

c++ - 在不向模型添加代码的情况下对模型添加操作

c++ - 练习 : calculate the variance using arrays

Java 正则表达式@字符串

java - 如何在 Java 中删除分数中的 "0,"?

c++ - 通过循环传递不同的数据类型

c++ - 当试图生成指向带有 decltype 的重载函数的函数指针时,为什么无法指定适当的重载?

c++ - 重载分辨率和数组 : which function should be called?