我有以下代码:
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 &&'
为什么会产生此错误,以及如何将其删除?即使模板T是refd',我也只想在我的元组中存储非引用值。
我可以使用编译它std::make_tuple<D>(std::forward<D>(val))
,但是它调用了我的move ctor,我想校准ctor,因为val
它在方法末尾被销毁了,所以它的内部数据和move ctor只是移动了它们,所以它们消失了。
您绝对不应将明确的模板参数传递给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>());
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句