防止通过引用传递右值

Prevent passing rvalue by reference

本文关键字:引用      更新时间:2023-10-16

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

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

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

A a("some temporal string object");

在该行中,时态string对象已被隐式创建和销毁。因此,在此之后a存储不正确的引用。

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

你只需要有一个与右值更匹配的重载,以便编译器将那个重载放在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_;
};