[lib.pairs] 8 pair
は、 "明示的なタイプ" make_pair
さんしばらく「タイプを使用していることを、標準状態推論される "。
これは、標準がpair
のコンストラクタを定義する理由は次のとおりです。
template <class T1, class T2>
pair(const T1& x, const T2& y)
あなたがC++03 compilerにあなたのコードを実行する場合は、このエラーメッセージが表示されます:
non-static reference member int& std::pair<int&, int&>::first
, can't use default assignment operator
問題はpair
が使用していることですimplicitly-declared copy assignment operatorこれが定義されていない場合は、pair
:
Has a non-static data member of a reference type
make_pair
またはpair
コンストラクタで定義されているテンプレート引数は、pair
のメンバの両方をint&
と定義するため、暗黙的に宣言されたコピー代入演算子は定義されません。 これはC++ 03のpair
では実現できません。
リターン・パラメータを使用することが望ましくない場合、あなたはtie
の独自の実装を書くことができますが:
tie<int, int>(a, b) = test();
正確なCを取得するには++:
template <class T1, class T2>
struct tie{
T1& first;
T2& second;
tie(T1& x, T2& y) : first(x), second(y) {}
tie<T1, T2>& operator=(const pair<T1, T2>& rhs){
first = rhs.first;
second = rhs.second;
return *this;
}
};
これはpair
の割り当てができるようになりますテンプレート引数を必要としない11の振る舞いでは、関数を定義する必要があります。これは、単にC++ 11とpair
の割り当てを可能にする
template <class T1, class T2>
details::tie<T1, T2> tie(T1& x, T2& y) {
return details::tie<T1, T2>(x, y);
}
:tie
をnamespace details
にネストされている場合、関数は次のように定義することができる
tie(a, b) = test();
Live Example
なおこれはまだint&
テンプレート引数を使用することを許容しないので、details::tie<int&, int&>
とtie<int&, int&>
は以前と同じように失敗します。
私はこれを行うことによってあなたが言っていることを検証しました。 'pair foo = make_pair (a、b)'エラー: "' std :: pair 'から非スカラー型' std :: pair 'への変換が要求されています。これがなぜなのか、もう少し詳しく教えてください。 'make_pair'が参照型を取り除くだけの場合、なぜそれらをテンプレート引数として渡すことができますか? –
あなたは 'make_pair'にテンプレートパラメータを提供するつもりはありません。あなたができることは、言語セマンティクスの単なる(この場合は不幸な)効果です。なぜなら、*なぜ*が行くかは、参照ではなくスタンドアロンの値を作るように設計されたからです。私は具体的な実装についてはわかりませんし、C++ 2003の標準を持っていない方が良いでしょう – krzaq