メンバ関数のConst参照修飾子[duplicate]
-
21-12-2019 - |
質問
私はそこにanwserで見てきました:右辺値参照で返す方が効率的ですか?
メンバー関数の定義:
Beta_ab const& getAB() const& { return ab; }
私はに精通しています cv修飾子 (const
)メンバー関数ではなく、 const&
.
最後に何をしますか const&
どういうこと?
解決
ザ- &
である。 ref-qualifier.Ref-qualifierはC++11の新機能であり、すべてのコンパイラではまだサポートされていないため、現在はそれほど頻繁には表示されません。この関数は左辺値でのみ呼び出すことができることを指定します(右辺値では呼び出すことはできません)。:
#include <iostream>
class kitten
{
private:
int mood = 0;
public:
void pet() &
{
mood += 1;
}
};
int main()
{
kitten cat{};
cat.pet(); // ok
kitten{}.pet(); // not ok: cannot pet a temporary kitten
}
Cv-qualifierと組み合わせて使用することができます。 const
, 、これは、左辺値でのみこのメンバー関数を呼び出すことができ、それらはconstである可能性があることを意味します。
他のヒント
私たちはこのコードでそれを知っています。..
Beta_ab const& getAB() const { return ab; }
^^^^^
強調表示されている const
メンバー関数が呼び出される可能性があることを意味します const
オブジェクト。メンバ関数は、常に非メンバ関数に対して呼び出すことができます-const
関数のcv-qualificationに関係なくオブジェクト。
このコードではそうです。..
Beta_ab const& getAB() const & { return ab; }
^
私たちは、強調表示されたことを期待すべきです &
また、このメンバー関数がどのような種類のオブジェクトを呼び出すことができるかについても述べています。私たちは正しいでしょう;C++11では、メンバ関数は左辺値でのみ呼び出すことができます。
Beta_ab const& getAB() const& { return ab; }
Beta_ab && getAB() && { return ab; }
上記の例では、最初のオーバーロードは左辺値で呼び出され、2番目のオーバーロードは非左辺値で呼び出されます-const
右辺値。通常の関数パラメーターに修飾子を適用した、次のよりよく知られた例と同様です:
void setAB(AB const& _ab) { ab = _ab; }
void setAB(AB && _ab) { ab = std::move(_ab); }
この例のように、2番目のオーバーロードが削除された場合、最初のオーバーロードは右辺値を受け入れます。