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
版本的运算符意味着您无法在 const
字符串对象上使用它。
const
结果只是运算符本身 const
性的结果:如果您有一个 const
字符串并使用运算符来获取对单个字符的引用,显然该引用也必须是 const
(如果没有,您可以更改 const
字符串中的单个字符)。
假设你有
const std::string str{"test"};
std::cout << str[2];
如果没有
const
成员函数,上面的代码将会失败,因为隐式传递给 this
的 operator[]
指针是 const
。
如果你有一个
const std::basic_string
,你不能调用(非常量)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
限定的 std::basic_string
对象上调用该方法。