gpt4 book ai didi

c++ - 将右值引用转换为临时参数的正确方法在 C++ 中返回 const 左值

转载 作者:行者123 更新时间:2023-12-02 10:11:04 26 4
gpt4 key购买 nike

我正在尝试实现类似 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,此功能将无法正常工作是一个临时对象:
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 的对象is bound 已经被销毁了。 get函数不应使用参数 def 的临时对象调用.
相反,您可以将临时对象复制到变量中,然后使用对变量的引用调用函数。
auto copied_object = get_temporary_object();
const sometype &val = get(not_existing_key, copied_object);
do_something_with(val);
现在, val 的对象绑定(bind)在变量 copied_object中.

关于c++ - 将右值引用转换为临时参数的正确方法在 C++ 中返回 const 左值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63563550/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com