次のC++プログラムを検討してください
#include<map>
#include<iostream>
int main() {
int a = 5, b = 7;
auto pair = std::make_pair<int, int>(a,b);
return 0;
}
VC11とgcc-4.7.2の使用は、さまざまなエラーで失敗しますが、関連しているようで、VC11エラーメッセージの方が意味があります。
You cannot bind an lvalue to an rvalue
この失敗から私が理解しているのは
- VC11と私は、gcc-4.7.2には
make_pair(_Ty1&& _Val1, const _Ty2& _Val2)
、右辺値参照のみを受け入れることができるstd::make_pairの実装が1つしかないことを想定しています。以前のVC++バージョンの例VC10には2つのバージョンがあり、1つは左辺値を受け入れ、もう1つは右辺値参照を受け入れます。 - 右辺値参照を使用して非定数参照を初期化することはできません。つまり
int & a = b * 5
、無効です。 - を参照
std::move
に変換するために使用できたので、呼び出しは成功します。lvalue
rvalue
- パラメータごとに2つの異なるタイプを受け入れるため
std::make_pair
、考えられるすべての場合のテンプレート引数解決でパラメータのタイプを解決でき、タイプを明示的に指定する必要はありません。
このシナリオは些細なことのように思われ、明示的な型の指定を削除して次のように定義することで、非互換性を簡単に解決できます。
auto pair = std::make_pair(a,b);
- さて、私の質問は、ライブラリから左辺値の実装を削除するための推進要因は何ですか?
- 同様の方法で変更された他のライブラリ関数を知ることは可能ですか?
- g ++、CC、aCC、XL C ++などの複数のコンパイラーをターゲットにする必要がある場合にこれらの状況を処理する方法。コンパイラーがアップグレードされていないか、コンパイラーが右辺値参照や移動セマンティクスをサポートしていません。