[英]Can I have a const member function that returns *this and works with non-constant objects?
如果我理解正確,應該將不應該修改對象的成員函數聲明為const
以便讓用戶知道保證。 現在,當該成員函數返回對*this
的引用時會發生什么? 例如:
class C{
public:
C &f() const {return *this;}
};
在C::f()
, this
的類型為const C*
,因此,以下內容不會編譯:
int main() {
C c; // non-constant object!
c.f();
return 0;
}
當然,我們可以提供非常量版本的C::f()
來處理非常量對象:
class C{
public:
const C &f() const;
C &f();
};
但是,我不相信這是我們想要的。 請注意,非常量版本不會更改對象,但是對用戶的這種承諾沒有表達出來......我錯過了什么?
編輯:為了清楚起見,我只是總結一下這個問題: f()
不修改調用它的對象,因此將其聲明為C &f();
不使它成為const
成員是誤導。 另一方面,我確實希望能夠在非const對象上調用f()
。 我該如何解決這種情況?
編輯:它來自評論中發生的所有討論,該問題是基於對函數成員的const
所暗示的錯誤理解。 我正在為自己帶走的正確理解是:
返回非const引用的成員函數旨在允許其用戶通過返回的引用更改對象。 因此,即使此函數本身不更改對象,也不應該將它聲明為const
成員!
您的問題是原始函數定義:
C &f() const {return *this;}
在這里你返回一個對const對象的非const引用,這將允許更改const對象並且是危險的,因此它是被禁止的。
如果你把它寫成
const C &f() const {return *this;}
可以從const和非const對象調用,並且總是返回一個const引用。
當然,我們可以提供一個非常量版本的C :: f()來處理非常量對象。 但是,我不相信這是我們想要的。
可能這正是你想要的。 它是在非const對象上調用時返回非const引用的唯一方法,並且在const對象上調用const時保持const正確性。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.