考虑这个课程
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&)
,则常量丢失.
传递指针不会强制对象真正指向某个东西.
是否可以获得所有三个:
常量性
非空
禁止临时
Martin Bonne.. 6
在旧的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&&
版本,但因为它被删除,所以调用格式不正确.如果有人传递左值,那将绑定到const引用.
在旧的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&&
版本,但因为它被删除,所以调用格式不正确.如果有人传递左值,那将绑定到const引用.