[英]Invalid init of non-const reference of type std::basic_string<char>::const_iterator& from rvalue of type std::basic_string<char>::const_iterator
[英]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.