Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/153.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 如何在C++;?_C++_Reference_Move_Lvalue_Rvalue - Fatal编程技术网

C++ 如何在C++;?

C++ 如何在C++;?,c++,reference,move,lvalue,rvalue,C++,Reference,Move,Lvalue,Rvalue,拥有一个带有默认构造函数和移动构造函数的类小部件,我想编写一个函数: 接受类型为Widget的左值和右值作为参数 从该参数内部“移动”,例如,移动到某个其他小部件实例 例如: Widget w; auto p1 = pointer_from_lrvalue(Widget()); // rvalue argument auto p2 = pointer_from_lrvalue(w); // lvalue argument // w is guaranteed to be no longer us

拥有一个带有默认构造函数和移动构造函数的类
小部件
,我想编写一个函数:

  • 接受类型为
    Widget
    的左值和右值作为参数
  • 从该参数内部“移动”,例如,移动到某个其他
    小部件
    实例
  • 例如:

    Widget w;
    auto p1 = pointer_from_lrvalue(Widget()); // rvalue argument
    auto p2 = pointer_from_lrvalue(w); // lvalue argument
    // w is guaranteed to be no longer used from now on
    
    其中
    指针\u from\u lrvalue()
    可能如下所示:

    std::unique_ptr<Widget> pointer_from_lrvalue(Widget w) {
       return std::unique_ptr<Widget>(new Widget(std::move(w)));
    }
    
    第二种方法使用通用参考:

    template <typename T>
    std::unique_ptr<std::remove_reference_t<T>> pointer_from_lrvalue(T&& t) {
       return std::unique_ptr<std::remove_reference_t<T>>
           (new std::remove_reference_t<T>(std::move(t)));
    }
    
    class WidgetMover
    {
      Widget& widget;
    
    public:
      Widget&& moveWidget() { return std::move(widget); }
    
      WidgetMover(Widget &w) : widget(w) {}
      WidgetMover(Widget &&w) : widget(w) {}
    };
    
    std::unique_ptr<Widget> pointer_from_lrvalue(WidgetMover w) {
       return std::unique_ptr<Widget>(new Widget(w.moveWidget()));
    }
    
    模板
    std::唯一的\u ptr指针\u自\u lrvalue(T&&T){
    返回std::unique\u ptr
    (新标准:删除参考(标准:移动(t));
    }
    
    我想知道:

  • 这些解决方案是否正确,是否保证不会调用
    小部件
    复制构造函数
  • 我应该选择这两种解决方案中的哪一种
  • 对于这个问题,还有其他更好的解决方案吗
  • 是的,它们都是正确的,并且保证只调用移动

  • 这是相当主观的。我个人更喜欢转发参考,因为我讨厌代码重复。但是,它确实需要将代码放入头中

  • 如果您想玩,可以创建自己的非模板“可移动
    小部件”
    参考:

    类WidgetMover
    {
    Widget&Widget;
    公众:
    Widget&&moveWidget(){return std::move(Widget);}
    WidgetMover(Widget&w):Widget(w){}
    WidgetMover(小部件&&w):小部件(w){}
    };
    std::唯一的\u ptr指针\u来自\u lrvalue(WidgetMover w){
    返回std::unique_ptr(新小部件(w.moveWidget());
    }
    
    必须注意确保没有
    WidgetMover
    在可能已初始化的右值的生存期之后继续存在

  • class WidgetMover
    {
      Widget& widget;
    
    public:
      Widget&& moveWidget() { return std::move(widget); }
    
      WidgetMover(Widget &w) : widget(w) {}
      WidgetMover(Widget &&w) : widget(w) {}
    };
    
    std::unique_ptr<Widget> pointer_from_lrvalue(WidgetMover w) {
       return std::unique_ptr<Widget>(new Widget(w.moveWidget()));
    }