web-dev-qa-db-ja.com

C ++のメンバー関数のconst&、&および&&指定子

最近、私は API of boost::optional を読んでいて、次の行に出くわしました:

T const& operator *() const& ;
T&       operator *() & ;
T&&      operator *() && ;

また、メンバー関数をconst&、&、&&として定義する独自のプログラムも作成しました(戻り値の型についてではなく、セミコロンの直前の指定子について説明していることに注意してください)。

メンバー関数constを宣言することの意味を知っていますが、const&、&、&&を宣言することの意味を誰にでも説明できます。

57
john_zac

const&は、このオーバーロードがconst、non-const、およびlvalueオブジェクトに対してのみ使用されることを意味します。

const A a = A();
*a;

&は、このオーバーロードが非constオブジェクトに対してのみ使用されることを意味します。

A a;
*a;

&&は、このオーバーロードが右辺値オブジェクトに対してのみ使用されることを意味します。

*A();

c ++ 11標準のこの機能の詳細については、この投稿を読むことができます 「* thisの右辺値参照」とは何ですか?

39
ForEveR

これはメンバー関数の参照修飾子であり、C++ 11で追加された機能の1つです。関数のref-qualifier( 一部の詳細 )を指定することにより、暗黙のthisオブジェクトパラメータが左辺値または右辺値のどちらであるかに基づいて、非静的メンバー関数をオーバーロードできます。

非静的メンバー関数の参照修飾子を指定するには、&または&&で関数を修飾できます。

#include <iostream>
struct myStruct {
    void func() & { std::cout << "lvalue\n"; }
    void func() &&{ std::cout << "rvalue\n"; }
};

int main(){
    myStruct s;
    s.func();            // prints "lvalue"
    std::move(s).func(); // prints "rvalue"
    myStruct().func();   // prints "rvalue"
}
35
Alper