我有这段代码:
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只是移动了他们,所以他们走了。
答案 0 :(得分:5)
您绝不应将显式模板参数传递给make_tuple
和make_pair
。它们的强大之处在于它们能够推断出类型,以及衰减它们和展开参考包装器。
以下内容应该有效:
std::tuple<D> t = std::make_tuple(std::move(val)); // forward is superfluous here
或者,更好的是:
auto t = std::make_tuple(GetValue<D>());