【发布时间】:2016-10-18 19:47:08
【问题描述】:
我有这个代码:
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)) 编译它,但它调用我的移动ctor,我想复制ctor,因为val 在方法结束时被销毁,因此它的内部数据和移动ctor 刚刚移动他们,所以他们走了。
【问题讨论】:
-
我可以看到希望避免意外调用复制和移动构造函数,但您的移动构造函数应该使原始对象无效以防止出现此问题。如果不能,您可能应该将其删除,因为几乎任何移动构造函数的使用都会中断。
标签: c++ c++11 templates tuples