如果 std::basic_string::operator[] 也是非 const 方法,为什么它是 const 方法?

Why is std::basic_string::operator[] a const method if it's also a non-const method?

本文关键字:方法 const 为什么 是非 basic std string operator 如果      更新时间:2023-10-16

http://cplusplus.com/reference/string/basic_string/operator[]

我知道拥有返回const的第二个版本是有利的,以防止在需要const结果时发出警告并减轻转换,但如果函数已经提供了非const方法(方法 - 不是结果),那么声明const-result方法const有什么意义?

你需要明白,第二个(const)版本不仅返回不同的结果,而且还自身标记为const(这是声明末尾的第二个const):

const_reference operator[] (size_type pos) const;

这是两件不同的事情:在存在非const方法的情况下,const返回值本身是不需要的(因为非常量返回值总是可以在const版本中强制转换)。

但是没有const版本的运算符意味着你不能在const字符串对象上使用它。

const结果只是运算符本身const性的结果:如果你有一个const字符串并使用运算符获取对单个字符的引用,显然这个引用也必须const(如果没有,你可以更改const字符串中的单个字符)。

假设你有

const std::string str{"test"};
std::cout << str[2];

如果您没有 const 成员函数,则上面的代码将失败,因为隐式传递给operator[]this指针const

如果你有一个const std::basic_string你不能调用(non-const)std::basic_string::operator[],因为它是,嗯,没有标记的const。

如果没有函数的const版本,则无法在const实例上调用该函数。例如:

void func (const std::string &h)
{
    if (h[0] == "hello")
        ...
}

如果没有const版本的operator[],这将如何工作?

const 方法返回不同的类型,它返回一个const限定的引用。这意味着如果使用const方法,则该方法的结果是const限定的(因此是"不可变的")。非 const 限定方法返回一个常规引用,该引用是"可变的"。

不能使用 const 方法,否则不能修改非 const 限定std::basic_string对象中的单个字符。而且不能使用非const方法,否则将无法在const -qualifed std::basic_string 对象上调用该方法。