1

rvalued stl コンテナーを処理する必要があるコードがあります。私の質問は、次のように、なぜメンバー関数が rvalued-stl-container から要素を返すのかということです。

vector<int>{1}.front()

右辺値ではなく左辺値を返しますか? 標準は、右辺値オブジェクトのメンバーが右辺値であることを指定します。返された要素を明示的に移動できることを知っていstd::moveます。しかし、戻り値が明らかに右辺値である場合、左辺値の戻り値の型を持つロジックは何ですか?

そのような式を値オーバーロード関数の引数として使用すると、間違ったオーバーロードが選択され、呼び出された関数が左辺値参照を取得します (すぐにぶら下がります)。

4

2 に答える 2

1

おそらく、アウトバウンド右辺値の追加はoutplace_front()、インバウンド右辺値の精神にoutplace_back()基づいたより良い名前になるでしょう 。emplace_front()emplace_back()

于 2013-02-01T10:17:50.970 に答える
1

コンパイラが特定のメンバー関数 ( など) を呼び出すことを決定するとint &std::vector<int>::front()、型システムは anint &が返されることしか認識しないため、その有効期間が所有者の一時的なものに制限されていても、それを左辺値として扱う必要があります。

C++11 より前は、メンバー関数が呼び出されているオブジェクトの値カテゴリに従ってオーバーロードすることはできませんでした ( What is "rvalue reference for *this"? を参照) 。物体; 非 const の一時的なものは明らかにそうではないconstので、非constオーバーロードが利用可能でなければなりません。

あなたが特定した潜在的にぶら下がっている左辺値参照と同様に、これは C++03 でoperator<<(メンバー関数演算子)ostreamで呼び出すことができますが、 (フリー演算子) では呼び出すことができない状況につながりました。C++11 では、右辺値参照の無料演算子オーバーロードとメンバー関数の右辺値オーバーロードでこれを修正しています。charstring*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メンバー関数の本体内のアクセスのメンバーに影響を与えないためです。

于 2013-02-01T10:19:25.870 に答える