C++

C++-引用限定符

Posted by w@hidva.com on April 16, 2016

引用限定符

  • 引用限定符;可以在参数列表之后使用引用限定符来指定this对象的左值与右值属性;
    • 若引用限定符为&,则表明this对象指向着左值对象;
    • 若引用限定符为&&,则表明this对象指向着右值对象.
    struct X {
        void foo() &;
        void foo() &&;
    };
    
  • 引用限定符有哪些限定;

    • 限定了this的左值/右值属性;若引用限定符为&,则表明该成员函数只需要左值对象调用;若为 &&,则表明只需要右值对象调用.如:

      struct X {
          void foo() && {}
      };
      
      // 编译器会提示 error: passing ‘X’ as ‘this’ argument discards qualifiers [-fpermissive]
      X x;
      x.foo();
      
      struct X {
          void foo() & {}
      };
      
      // 编译器也会提示 passing ‘X’ as ‘this’ argument discards qualifiers
      X().foo();
      
    • 重载;编译器会在以左值对象调用成员函数时调用&限定版本.在以右值对象来调用成员函数时调 用&&版本.

      struct X {
          void foo() & {} // 1
          void foo() && {}// 2
      };
      
      X x;
      x.foo(); // 调用 foo1(),
      
      X().foo(); // 调用 foo2();
      
  • 引用限定符语法点:

    • 引用限定符必须同时出现在声明以及实现之后.
    • 引用限定符必须出现在’const限定符’之后;如:

      struct X {
          void foo() const &; // 正确.
          void bar() & const; // 错误!
      };
      
    • 若引用限定符用于重载;则所有同名函数要么都带有引用限定符;要么都不带有引用限定符;不然会编 译出错.

参考

  • C++Primer5