【问题标题】:How do I safely hold on to a C++ const reference?如何安全地保留 C++ const 引用?
【发布时间】:2016-12-01 21:46:02
【问题描述】:

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

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

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

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

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

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

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

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

旁注:是的,这总是会存在潜在的生命周期管理问题,但到目前为止,由于其有限的使用模式,真实的东西运行良好 - 但观察到意外传递临时对象在实践中,所以我们可能想先解决这个问题。

【问题讨论】:

  • void observe(T&amp;&amp;) = delete; 有什么问题?
  • delete 采用T &amp;&amp; 参数的重载。

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


【解决方案1】:

你可以添加一个右值引用重载,然后删除它:

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

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

【讨论】:

  • 谁能解释一下它是如何工作的? T&amp;&amp; x 是否意味着 x 是引用的引用?否则,void observe(const T&amp; x)void observe(const T&amp;&amp; x) 有什么区别?
  • @Angelo 这是一个右值引用。
  • 非 const (T&amp;&amp; x) 重载怎么样 - 是否需要它以及它与重载集有何关系?
  • @MartinBa 不需要,因为非 const 右值仍然更喜欢 const T&amp;&amp; 重载。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-12-27
  • 1970-01-01
  • 2011-10-26
  • 2013-10-06
  • 1970-01-01
相关资源
最近更新 更多