C ++-std :: decay <T>和std :: make_tuple <D>-无法将参数从'D'转换为'D &&'

马丁·佩里

我有以下代码:

template <typename T>
void someFunction(){
   typedef std::decay<T>::type D;

   D val = GetValue<D>();
   std::tuple<D> t = std::make_tuple<D>(val);

   //... tuple is stored outside this scope in global variable
}

GetValue<D>()从基于的字典返回值typeid(D),它工作正常,然后返回MyDataD-如果我注释掉下一个有问题的行,则对其进行了测试,请参见下面的问题。

如果我编译它,因为T = const MyData &我得到了

 error C2664: 'std::tuple<MyData > std::make_tuple<D>(D &&)': cannot convert argument 1 from 'D' to 'D &&'

为什么会产生此错误,以及如何将其删除?即使模板T是refd',我也只想在我的元组中存储非引用值。

我可以使用编译它std::make_tuple<D>(std::forward<D>(val)),但是它调用了我的move ctor,我想校准ctor,因为val它在方法末尾被销毁了,所以它的内部数据和move ctor只是移动了它们,所以它们消失了。

克尔扎格

您绝对不应将明确的模板参数传递给make_tuplemake_pair它们的能力恰恰在于其推断类型,分解它们和展开参考包装的能力。

以下应该工作:

std::tuple<D> t = std::make_tuple(std::move(val)); // forward is superfluous here

或者,更好的是:

auto t = std::make_tuple(GetValue<D>());

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章