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();
}
当我用clang 3.5编译时,我得到了这个输出:
& -> &
const& -> const&
&& -> &
const&& -> const&
为什么r值限定符会被丢弃?而有没有办法来调用f从g用正确的预选赛?
Bri*_*ian 11
该呼叫f()被解释为(*this).f().取消引用指针的结果总是左值,因此*this是左值并且调用左值限定函数.
这种行为甚至有意义,至少对我而言.大多数情况下,rvalue表达式引用的对象将在full-expression(临时)的末尾或当前作用域的末尾(我们选择的自动局部变量)被销毁std::move.但是当你在一个成员函数中时,这些都不是真的,所以对象不应该把它自己当作右值,可以这么说.这也是为什么将右值参考函数参数的名称作为函数中的左值是有意义的.
如果您想要f调用rvalue-qualified ,您可以这样做:
std::move(*this).f();
| 归档时间: | 
 | 
| 查看次数: | 712 次 | 
| 最近记录: |