防止通过引用传递右值

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存储不正确的参考.

如何防止这种行为?如果它导致编译错误会更好......

Rak*_*111 5

您只需要有一个与右值更好匹配的重载,以便编译器采用该重载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)

  • 是的,正确的解决方案可能只是采用一些类似智能指针的对象来包装指针并且只能由 arena 生成。 (2认同)