C++ 我如何安全地保持C++;常数参考? 又称作如何防止常量&参数意外绑定到临时变量?

C++ 我如何安全地保持C++;常数参考? 又称作如何防止常量&参数意外绑定到临时变量?,c++,pass-by-const-reference,C++,Pass By Const Reference,我们有一个类,基本上如下所示: template<typename T> struct Observer { const T* target; void observe(const T& x) { target = &x; } }; 模板 结构观察者{ 常数T*目标; 无效观察(常数T&x){ 目标=&x; } }; 也就是说,这些对象将“保持”它们所传递的const ref 我们遇到了一个bug,observe函数意外地传递了一个临时对象

我们有一个类,基本上如下所示:

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

  void observe(const T& x) {
     target = &x;
  }
};
模板
结构观察者{
常数T*目标;
无效观察(常数T&x){
目标=&x;
}
};
也就是说,这些对象将“保持”它们所传递的const ref

我们遇到了一个bug,
observe
函数意外地传递了一个临时对象,这在这种情况下永远都是无效的

我们有哪些选项可以防止意外绑定到临时服务器

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


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

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

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

现在,如果有人试图传递一个临时消息,就会发出编译错误。

void observe(T&&)=delete有什么问题?
delete
一个重载,它接受一个
T&
参数。有人能解释一下它是如何工作的吗?
T&&x
是否意味着
x
是引用的引用?否则,void
observe(const T&x)
void observe(const T&x)
之间有什么区别?@Angelo它是一个右值引用。那么非const
(T&x)呢
重载-是否需要重载?它与重载集的关系如何?@MartinBa不需要重载,因为非常量值仍会选择
常量T&
重载。