代码之家  ›  专栏  ›  技术社区  ›  fredoverflow

用右值方法从*移走?

  •  10
  • fredoverflow  · 技术社区  · 15 年前

    在C++ 11中,方法可以重载,表示表示方法调用的对象的表达式是否为LValk或rValk。如果我回来 *this 从通过rvalue调用的方法中,是否需要显式地 move

    Foo Foo::method() &&
    {
        return std::move(*this);   // Is this move required or not?
    }
    

    不幸的是,我不能在我的编译器上简单地测试这个功能,因为g++还不支持这个功能:(

    1 回复  |  直到 13 年前
        1
  •  4
  •   Xeo    13 年前

    类型 *this 总是 左值:

    §9.3.2 [class.this] p1

    在非静态(9.3)成员函数的主体中,关键字 this 是一个prvalue表达式,其值是为其调用函数的对象的地址。类型 X X* . [...]

    §5.3.1 [expr.unary.op] p1

    一元 * 操作员执行 间接 :应用它的表达式应是指向对象类型的指针,或指向函数类型和类型的指针 指表达式指向的对象或函数。

    std::move 如果要调用move构造函数。

    以下代码段显示:

    #include <iostream>
    #include <utility>
    
    struct test{
      test(){}
      test(test const&){ std::cout << "copy ctor // #1\n"; }
      test(test&&){ std::cout << "move ctor // #2\n"; }
    
      test f_no_move() &&{ return *this; }
      test f_move() &&{ return std::move(*this); }
    };
    
    int main(){
      test().f_no_move(); // #1
      test().f_move(); // #2
    }
    

    使用Clang 3.1(我所知道的唯一实现ref限定符的编译器),我得到以下输出:



    复制ctor//#1
    移动ctor//#2