在 C++ 中将对临时参数的右值引用转换为 const 左值 return 的正确方法

Correct way to convert rvalue reference to temporary parameter to const lvalue return in C++

我正在尝试实现类似查找的方法以从容器中提取对值的引用,并且 return 如果未找到该值或该值类型不兼容,则为默认值。

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 是临时对象,此函数将无法正常工作:

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 也可能是抽象基础 class。而且,拜托,我更喜欢无提升解决方案。

不,你不能。临时对象仅对该语句有效,在您通过返回的引用访问它之前将被销毁。

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中。