假设我有:
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)
合适。
std::forward<T>(value)
当不知道 T &&
是否正确时,这是正确的选择绑定(bind)到右值或左值。这里就是这种情况,因为在构造函数中我们不知道 T &&
是否存在。相当于U &&
对于一些普通类型 U
, 或相当于 U & &&
.
是否T
并不重要在使用 std::forward
的函数调用中推导出来或在不同时间确定(例如在您的示例中,T
是在实例化 Node
模板时确定的)。
std::forward<T>(value)
将以与调用者直接调用基类构造函数相同的方式调用继承的构造函数。即,它会在 value
时以左值调用它是左值,当 value
时是右值是右值。
关于c++ - 我在这里使用 std::forward 还是 std::move?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17355521/