[英]Correct way to convert rvalue reference to temporary parameter to const lvalue return in C++
我正在尝试实现类似 find 的方法,以从容器中提取对值的引用,如果未找到该值或该值的类型不兼容,则返回一个默认值。
template<class T> const T& get (key_type k, const T& def)
{
const T* r = dynamic_cast<const T*> (find(k)); // suppose `find` returns a pointer to common base class or NULL if the key not found
return r ? *r : def;
}
如果def
是一个临时对象,此函数将def
正常工作:
const sometype& val = find(key, sometype(someargs));
那么,是否可以使用右值引用并以某种方式移动或复制临时对象来处理这种情况?
template<class T> const T& get (key_type k, T&& def)
{
const T* r = dynamic_cast<const T*> (find(k)); // suppose `find` returns a pointer to common base class or NULL if the key not found
return r ? *r : std::move(def); // or copy? or something else?
}
T
也可能是一个抽象基类。 而且,拜托,我更喜欢无升压解决方案。
不,你不能。 临时对象仅对该语句有效,并且在您通过返回的引用访问它之前将被销毁。
const sometype &val = get(not_existing_key, get_temporary_object());
do_something_with(val);
当你do_something_with(val)
,引用val
绑定到的对象已经被销毁。 不应使用参数def
的临时对象调用get
函数。 相反,您可以将临时对象复制到一个变量,然后使用对变量的引用调用函数。
auto copied_object = get_temporary_object();
const sometype &val = get(not_existing_key, copied_object);
do_something_with(val);
现在, val
绑定到的对象位于变量copied_object
。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.