我如何安全地保留 C++ const 引用?
How do I safely hold on to a C++ const reference?
又名。如何防止 const&
参数意外绑定到临时参数?
我们有一个 class 基本上看起来像这样:
template<typename T>
struct Observer {
const T* target;
void observe(const T& x) {
target = &x;
}
};
也就是说,这些对象将 "hold on" 传递给它们传递的 const-ref。
我们有一个错误,其中 observe
函数意外地传递了一个临时对象 - 对于这种情况永远不会有效。
我们有哪些选项可以防止意外绑定到临时文件?
将签名更改为 (const T* px)
在技术上可行(获取临时地址是编译器 warning=error 此处)由于其他原因它不是很有吸引力。
旁注:是的,这总会有潜在的生命周期管理问题,但到目前为止,由于其有限的使用模式,真实的东西运行得很好——但意外地传递了临时文件 已在实践中观察到,因此我们可能希望首先解决该问题。
您可以添加和删除右值引用重载:
void observe(const T&& x) = delete;
现在,如果有人试图通过一个临时文件,将发出编译错误。
又名。如何防止 const&
参数意外绑定到临时参数?
我们有一个 class 基本上看起来像这样:
template<typename T>
struct Observer {
const T* target;
void observe(const T& x) {
target = &x;
}
};
也就是说,这些对象将 "hold on" 传递给它们传递的 const-ref。
我们有一个错误,其中 observe
函数意外地传递了一个临时对象 - 对于这种情况永远不会有效。
我们有哪些选项可以防止意外绑定到临时文件?
将签名更改为 (const T* px)
在技术上可行(获取临时地址是编译器 warning=error 此处)由于其他原因它不是很有吸引力。
旁注:是的,这总会有潜在的生命周期管理问题,但到目前为止,由于其有限的使用模式,真实的东西运行得很好——但意外地传递了临时文件 已在实践中观察到,因此我们可能希望首先解决该问题。
您可以添加和删除右值引用重载:
void observe(const T&& x) = delete;
现在,如果有人试图通过一个临时文件,将发出编译错误。