gpt4 book ai didi

c++ - 为什么data()和c_str()返回的是char const*,而operator[]返回的是char&?

转载 作者:塔克拉玛干 更新时间:2023-11-02 23:55:10 25 4
gpt4 key购买 nike

为什么 std::string::datastd::string::c_str() 返回指向 const 字符的指针,而std::string::operator[] 返回对可变 字符的引用?

std::string string("eightfold is the greatest");

auto s = string.data();
*s = 'r'; // illegal

auto t = &string[0];
*t = 'r'; // totally fine

auto& c = string[0];
c = 'r'; // totally fine

为什么 std::string::data()std::string::c_str() 不返回 char* ,或者为什么 std::string::operator[] 不返回 char const&

这背后的原理是什么?

最佳答案

operator [] 使您可以直接访问 std::string 对象的受控序列。 c_str()原来没有。

std::string 的原始规范中,存储的序列不需要是零终止的字符串。这意味着在一般情况下 c_str() 无法返回指向存储序列的直接指针。它必须返回一个指针,指向一个完全独立的、单独分配的受控序列的临时拷贝(添加了一个零终止符)。因此,尝试修改 c_str() 返回的 C 字符串毫无意义。应用于该单独 C 字符串的任何修改都不会传播到实际的受控序列。 (事实上​​,规范明确禁止任何修改尝试。例如,对于一个空的 std::string,实现可以简单地返回一个指向字符串文字 "" 的指针,这当然是不可修改的,并且可以在所有 std::string 对象之间轻松共享。)因此,让 c_str() 返回 是非常有意义的>const char *.

C++11 更改了 c_str() 的内部规范,使其返回指向实际控制序列的直接指针。但是 c_str() 的外部规范保持不变,以使其与遗留规范保持一致。

关于c++ - 为什么data()和c_str()返回的是char const*,而operator[]返回的是char&?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19757209/

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