Ale*_*xey 5 c++ reference pass-by-reference c++11
在我的项目中,大多数对象都是在竞技场中创建的,并且保证它们在用户会话期间存在.因此,某些类将const引用作为成员字段是非常安全的,例如:
class A {
public:
A(const string& str) : str_(str) {}
private:
const string& str_;
};
Run Code Online (Sandbox Code Playgroud)
但这里有一个陷阱.错误地,可以创建A以下方式的实例:
A a("some temporal string object");
Run Code Online (Sandbox Code Playgroud)
在该行中,临时string对象已被隐式创建和销毁.因此,a存储不正确的参考.
如何防止这种行为?如果它导致编译错误会更好......
您只需要有一个与右值更好匹配的重载,以便编译器采用该重载const&。
因此,临时变量&&比 a更好地匹配 a 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_;
};
Run Code Online (Sandbox Code Playgroud)