gpt4 book ai didi

c++ - c_str() 的要求是否使修改非法?

转载 作者:行者123 更新时间:2023-11-30 02:41:10 29 4
gpt4 key购买 nike

我的 C++ 标准草案拷贝(标记为“ISO/IEC JTC1 SC22 WG21 N3690Date: 2013-05-15") 对 basic_string::c_str()basic_string::data() 的定义如下。

const charT* c_str() const noexcept; 
const charT* data() const noexcept;

Returns: A pointer p such that p + i == &operator[](i) for each i in [0,size()].

Complexity: constant time.

Requires: The program shall not alter any of the values stored in the character array.

那么,下面的 C++ 程序似乎有未定义的行为,因为它跳过了 c_str() 的要求:

#include <string>
int main() {
std::string foo = "foo";
foo.c_str();
foo[2] = 'p';
}

这看起来非常愚蠢。我是否误解了标准,或者对 c_str 的要求是过去时代的遗物?

最佳答案

特定的措辞是 C++03 时代规范的遗留物,该规范允许写时复制字符串。在 some point in the past c_str() 的规范如下:

Returns: A pointer to the initial element of an array of length size() + 1 whose first size() elements equal the corresponding elements of the string controlled by *this and whose last element is a null character specified by charT().

Requires: The program shall not alter any of the values stored in the array. Nor shall the program treat the returned value as a valid pointer value after any subsequent call to a non-const member function of the class basic_string that designates the same object as this.

在这种情况下,要求更有意义。如果 c_str() 返回一个指向不同 std::string 之间共享的字符串的指针,那么修改数组中的值将非常糟糕。

在 C++14 中,这个禁令毫无意义。正如您所指出的,将其理解为在 c_str() 调用之后完全禁止修改字符串没有多大意义;将其理解为禁止通过返回的指针修改 string 会稍微更有意义,但意义不大。 c_str() 返回的指针和使用 &operator[](0) 获得的指针之间的语义应该不同的真正原因没有。

关于c++ - c_str() 的要求是否使修改非法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28391138/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com