コンパイラが特定のメンバー関数 ( など) を呼び出すことを決定するとint &std::vector<int>::front()
、型システムは anint &
が返されることしか認識しないため、その有効期間が所有者の一時的なものに制限されていても、それを左辺値として扱う必要があります。
C++11 より前は、メンバー関数が呼び出されているオブジェクトの値カテゴリに従ってオーバーロードすることはできませんでした ( What is "rvalue reference for *this"? を参照) 。物体; 非 const の一時的なものは明らかにそうではないconst
ので、非const
オーバーロードが利用可能でなければなりません。
あなたが特定した潜在的にぶら下がっている左辺値参照と同様に、これは C++03 でoperator<<
(メンバー関数演算子)ostream
で呼び出すことができますが、 (フリー演算子) では呼び出すことができない状況につながりました。C++11 では、右辺値参照の無料演算子オーバーロードとメンバー関数の右辺値オーバーロードでこれを修正しています。char
string
*this
右辺値は、次*this
の 3 つのオーバーロードを許可しますfront
。
T &front() & { return data_[0]; }
const T &front() const & { return data_[0]; }
T &&front() && { return std::move(data_[0]); }
右辺値のオーバーロードの別の関数本体は、少し疣贅です。これは、ref 修飾子が*this
メンバー関数の本体内のアクセスのメンバーに影響を与えないためです。