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