繁体   English   中英

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

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

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 -version运算符意味着您不能在const字符串对象上使用它。

const结果却的结果const运营商本身的尼斯:如果你有一个const字符串,并使用操作以获得单个字符的引用,显然这引用也必须是const (如果不是,你可以改变单一const字符串中的字符)。

假设你有

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

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

如果您具有const std::basic_string ,则无法调用(非const) std::basic_string::operator[] ,因为它没有标记为const。

如果没有该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对象上调用该方法。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM