2

又名。如何防止const&参数意外绑定到临时参数?

我们有一个基本上看起来像这样的类:

template<typename T>
struct Observer {
  const T* target;

  void observe(const T& x) {
     target = &x;
  }
};

也就是说,这些对象将“保留”它们通过的 const-ref。

我们有一个错误,该observe函数意外地传递了一个临时对象 - 在这种情况下永远不会有效。

我们有哪些选项可以防止意外绑定到临时对象?

将签名更改为在(const T* px)技术上可以工作(获取临时地址是编译器警告=错误)由于其他原因它不是很有吸引力。

旁注:是的,这总是会有潜在的生命周期管理问题,但到目前为止,由于其有限的使用模式,真实的东西工作得很好——但在实践中已经观察到意外传递临时对象所以我们可能希望首先解决这个问题。

4

1 回答 1

5

您可以添加右值引用重载,然后将其删除:

void observe(const T&& x) = delete;

现在,如果有人尝试传递临时文件,则会发出编译错误。

于 2016-12-01T21:48:14.800 回答