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

时间:2016-10-18 19:47:08

标签: c++ c++11 templates tuples

我有这段代码:

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)从字典中返回值,它正常工作,我将MyData返回D - 如果我注释掉下一个有问题的行,我测试了它,请看下面的问题。

如果我编译它,对于T = const MyData &我得到了这个

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

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

我可以通过使用std::make_tuple<D>(std::forward<D>(val))来编译它,但它调用我的移动ctor并且我想要复制ctor,因为val在方法结束时被销毁,因此其内部数据和移动ctor只是移动了他们,所以他们走了。

1 个答案:

答案 0 :(得分:5)

您绝不应将显式模板参数传递给make_tuplemake_pair。它们的强大之处在于它们能够推断出类型,以及衰减它们和展开参考包装器。

以下内容应该有效:

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

或者,更好的是:

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