[英]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.