在我的项目中,大多数对象都是在竞技场中创建的,并且保证它们在用户会话期间存在。 因此,某些类将const引用作为成员字段是非常安全的,例如:
class A {
public:
A(const string& str) : str_(str) {}
private:
const string& str_;
};
但这里有一个陷阱。错误地,可以通过以下方式创建A
的实例:
A a("some temporal string object");
在该行中,隐式创建并销毁了时间string
对象。因此,a
存储错误的引用。
如何防止这种行为?如果它导致编译错误会更好......
答案 0 :(得分:4)
你只需要有一个与rvalues更好匹配的重载,这样编译器就可以在const&
之上获取一个。
因此,暂时更好地匹配&&
而非const&
,因此您只需提供此类构造函数并delete
:
class A {
public:
A(const string& str) : str_(str) {}
A(string&&) = delete; // this constructor is a better match for rvalues
private:
const string& str_;
};