我可以有一个返回*this并处理非常量对象的const成员函数吗
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()
不会修改调用它的对象,所以在不使其成为const
成员的情况下将其声明为C &f();
是有误导性的。另一方面,我确实希望能够在非常量对象上调用f()
。我该如何解决这种情况?
编辑:从评论中的所有讨论中可以看出,这个问题是基于对功能成员的const
含义的错误理解。我正在为自己夺走的正确理解是:
返回非常数引用的成员函数旨在允许其用户通过返回的引用更改对象。因此,即使此函数本身不会更改对象,也不应倾向于将其声明为const
成员!
您的问题是原始函数定义:
C &f() const {return *this;}
在这里,您返回一个对const对象的非const引用,这将允许更改const对象,这将是危险的,因此它是被禁止的。
如果你把它写成
const C &f() const {return *this;}
将可从const和非常量对象调用,并且将始终返回const引用。
当然,我们可以提供一个非常量版本的C::f((来处理非常量对象。然而,我不认为这是我们想要的。
也许这正是你想要的。这是在对非常量对象调用时返回非常量引用并在对常量对象调用时保持常量正确性的唯一方法。
相关文章:
- 被解释为低级别const的const对象的地址
- 使用共享指针的函数调用,其对象应为 const
- 如何从构造函数副本 T(const T&)调用对象 T?
- 在 C++ 中声明 const 对象需要用户定义的默认构造函数.如果我有一个可变成员变量,为什么不呢?
- Google Or-Tools Glop:如何创建指向 const 对象的指针数组?
- 无法使用类型 'const char *' 的左值初始化类型 'char *' 的成员子对象
- 我们可以有一个 setter 成员函数作为从 const 对象引用的 const 吗?
- "this"指向的对象是否与 const 对象相同?
- const auto & 和 auto & if reference 对象之间的区别是 const
- 将对象传递给函数而不将其包装到 std::ref 中,而参数被指定为 const 引用
- C++ - 确定 const char* 是指向字符串文本对象还是动态对象
- 为什么 const YAML::Node 对象的行为不像 yaml-cpp 中的类似值的对象?
- 从 const 对象访问非 const 方法
- 将非 const 对象用于 const 参数
- 如何键入用于const对象的自定义io操纵器
- 对临时对象的Const引用不会延长其生存期
- 正在通过const-ref未定义的行为捕获新构造的对象
- 具有成员变量的对象 Const 数组 = 先前索引成员变量的总和
- 为什么我构建的临时对象const不可变
- 强制用户声明对象const