function &&限定符行为

Tim*_*Tim 12 c++ rvalue-reference c++14

我对以下代码感到困惑:

struct test {
  void f() & {
    std::cout << "&" << std::endl;
  }
  void f() const& {
    std::cout << "const&" << std::endl;
  }
  void f() && {
    std::cout << "&&" << std::endl;
  }
  void f() const&& {
    std::cout << "const&&" << std::endl;
  }

  void g() & {
    std::cout << "& -> ";
    f();
  }
  void g() const& {
    std::cout << "const& -> " ;
    f();
  }
  void g() && {
    std::cout << "&& -> ";
    f();
  }
  void g() const&& {
    std::cout << "const&& -> ";
    f();
  }

  test() {} //allow default const construction
};

int main(int, char**) {
    test value;
    const test constant;

    value.g();
    constant.g();

    std::move(value).g();
    std::move(constant).g();
}
Run Code Online (Sandbox Code Playgroud)

当我用clang 3.5编译时,我得到了这个输出:

& -> &
const& -> const&
&& -> &
const&& -> const&
Run Code Online (Sandbox Code Playgroud)

为什么r值限定符会被丢弃?而有没有办法来调用fg用正确的预选赛?

Bri*_*ian 11

该呼叫f()被解释为(*this).f().取消引用指针的结果总是左值,因此*this是左值并且调用左值限定函数.

这种行为甚至有意义,至少对我而言.大多数情况下,rvalue表达式引用的对象将在full-expression(临时)的末尾或当前作用域的末尾(我们选择的自动局部变量)被销毁std::move.但是当你一个成员函数中时,这些都不是真的,所以对象不应该把它自己当作右值,可以这么说.这也是为什么将右值参考函数参数的名称作为函数中的左值是有意义的.

如果您想要f调用rvalue-qualified ,您可以这样做:

std::move(*this).f();
Run Code Online (Sandbox Code Playgroud)

  • @Nawaz我只是想让它更清楚. (3认同)