c – 我使用std :: forward还是std :: move here?
发布时间:2020-12-16 06:04:31 所属栏目:百科 来源:网络整理
导读:假设我有: templateclass Tstruct NodeBase{ T value; NodeBase(T value) : value(value) { }}; 我从它继承: templateclass Tstruct Node : public NodeBaseT{ Node(T value) : NodeBase( WHAT_GOES_HERE (value)) { }}; WHAT_GOES_HERE应该是std :: move
假设我有:
template<class T> struct NodeBase { T value; NodeBase(T &&value) : value(value) { } }; 我从它继承: template<class T> struct Node : public NodeBase<T> { Node(T &&value) : NodeBase( WHAT_GOES_HERE (value)) { } }; WHAT_GOES_HERE应该是std :: move或std :: forward< T>?为什么? 解决方法
由于在Node< T>的构造函数的实现中,T是否是普通类型(即不是参考)或引用是未知的,
std::forward<T>(value) 适合. 只要不知道T&&&&&&绑定到rvalue或lvalue.在这种情况下,因为在构造函数中,我们不知道T&&相当于U&&对于某些普通型U,或等同于U& &安培;&安培;. 在使用std :: forward或在不同时间确定的函数调用(例如在您的示例中,在实例化Node模板时确定T的情况下)推导T是否无关紧要. std :: forward< T>(value)将以与调用者直接调用基类构造函数相同的方式调用继承的构造函数.也就是说,当value是一个左值时,它会将它称为一个左值,当值是一个右值时,它将被称为右值. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |