0

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

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

4

5 回答 5

4

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

const_reference operator[] (size_type pos) const;

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

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

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

于 2016-01-25T00:56:18.253 回答
3

假设你有

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

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

于 2016-01-25T00:44:55.397 回答
2

如果您有 a const std::basic_string,则不能调用 (non-const) std::basic_string::operator[],因为它没有标记为 const。

于 2016-01-25T00:45:04.550 回答
1

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

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

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

于 2016-01-25T00:44:53.827 回答
0

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

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

于 2016-01-25T00:46:18.800 回答