簡體   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