假设我有:
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是一个左值时,它会将它称为一个左值,当值是一个右值时,它将被称为右值.