防止通过引用传递右值

时间:2017-06-23 07:22:38

标签: c++ c++11 reference pass-by-reference

在我的项目中,大多数对象都是在竞技场中创建的,并且保证它们在用户会话期间存在。 因此,某些类将const引用作为成员字段是非常安全的,例如:

class A {
 public:
  A(const string& str) : str_(str) {}

 private:
  const string& str_;
};

但这里有一个陷阱。错误地,可以通过以下方式创建A的实例:

A a("some temporal string object");

在该行中,隐式创建并销毁了时间string对象。因此,a存储错误的引用。

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

1 个答案:

答案 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_;
};