http://cplusplus.com/reference/string/basic_string/operator[]
我知道拥有第二个版本是有利的,该版本const在需要结果时返回以防止警告const并减轻强制转换,但如果该函数已经提供了非const方法(方法 - 不是结果),那么声明的意义何在const-结果方法const?
http://cplusplus.com/reference/string/basic_string/operator[]
我知道拥有第二个版本是有利的,该版本const在需要结果时返回以防止警告const并减轻强制转换,但如果该函数已经提供了非const方法(方法 - 不是结果),那么声明的意义何在const-结果方法const?
您需要了解,第二个 ( const) 版本不仅返回不同的结果,而且还将自身标记为const(这是const声明末尾的第二个):
const_reference operator[] (size_type pos) const;
这是两件不同的事情:如果const存在非方法,则不需要返回值本身const(因为总是可以将非常量返回值转换为const版本)。
但是没有const运算符的 -version 意味着您不能在const字符串对象上使用它。
结果const只是const运算符本身的结果:如果您有一个const字符串并使用运算符来获取对单个字符的引用,显然这个引用也必须是const(如果没有,您可以更改字符串中的单个const字符)。
假设你有
const std::string str{"test"};
std::cout << str[2];
如果您没有const成员函数,则上面的代码将失败,因为this隐式传递给operator[]is的指针const。
如果您有 a 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-qualified 引用。这意味着如果使用该const方法,则该方法的结果是const合格的(因此是“不可变的”)。非const限定方法返回一个常规引用,它是“可变的”。
您不能只有方法,const否则您不能修改非const限定std::basic_string对象中的单个字符。而且您不能只拥有非const方法,否则您将无法在const-qualifedstd::basic_string对象上调用该方法。