考虑这个类
class Foo
{
public:
Foo()
: r_obj(&nullobj)
{}
void setDataRef(const T& obj)
{
r_obj = &obj;
}
private:
static T nullobj;
const T* r_obj;
};
这会强制
r_obj
指向某个东西,我知道该类不能修改它指向的任何东西的逻辑状态。但是,现在将临时对象传递给 setDataRef
是完全合法的,这真的很糟糕。如果改为使用
setDataRef(T&)
,则常量性将丢失。传递指针不会强制对象真正指向某物。
是否有可能获得所有三个:
最佳答案
在旧的 C++ 中,我认为这是不可能的,但是使用 C++11 我们可以做到:
class Foo
{
public:
Foo()
: r_obj(&nullobj)
{}
void setDataRef(const T& obj)
{
r_obj = &obj;
}
void setDataRef(T&& obj) = delete; // Crucial extra line
private:
static T nullobj;
const T* r_obj;
};
如果有人试图将临时值传递给
setDataRef
,重载决议将更喜欢 T&&
版本,但由于它已被删除,因此调用格式错误。如果有人传递一个左值,它将绑定(bind)到 const 引用。关于c++ - 在保持常量性的同时强制非空,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/34437126/