为什么 std::basic_string::operator[] 同时是 const/非常量成员函数?

问题描述 投票:0回答:5

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

我知道,有一个返回

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

c++ operator-overloading overloading std function-qualifier
5个回答
4
投票

您需要了解,第二个 (

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

const_reference operator[] (size_type pos) const;

这是两个不同的事情:在存在非

const
方法的情况下,不需要
const
返回值本身(因为非常量返回值始终可以转换为
const
版本)。

但是没有

const
版本的运算符意味着您无法在
const
字符串对象上使用它。

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


3
投票

假设你有

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

如果没有

const
成员函数,上面的代码将会失败,因为隐式传递给
this
operator[]
指针是
const


2
投票

如果你有一个

const std::basic_string
,你不能调用(非常量)
std::basic_string::operator[]
,因为它是,没有标记为 const。


1
投票

如果该函数没有

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

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

如果没有

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


0
投票

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

您不能仅使用 const 方法,否则您无法修改非

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

© www.soinside.com 2019 - 2024. All rights reserved.