c++ - 我在这里使用 std::forward 还是 std::move?

标签 c++ c++11 move-semantics rvalue-reference

假设我有:

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_HEREstd::movestd::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/

相关文章:

rust - 有朝一日,Rust 可以在对象 move 期间优化掉按位复制吗?

c++ - 是什么导致 move 赋值运算符不被调用?

c++ - 模板类的友元模板函数

C++ 条件变量指示分离线程执行停止的结束

C++ gdi::Bitmap 到内存中的 PNG 图像

c++ - 如何使用户定义的空默认构造函数表现得像编译器定义的空构造函数

c++ - 在单链表上实现模板的问题

c++ - std::move 之后的僵尸对象

c++ - 类的构造函数中的 forward 和 move 有什么区别?

c++ - 完美转发等于什么