22

ここで何が起こっているのですか?anと a
のペアを作成しようとしていますが、「マジック値」を使用するとペアを作成できますが、変数を渡すことができないようです。intstring

std::vector<std::pair<int, std::string> > num_text;

std::string text = "Smeg";
int num = 42;

// Works fine
num_text.push_back(std::make_pair<int, std::string>(42, std::string("Smeg")));  

// Cannot convert parameter 2 from 'std::string' to 'std::string &&'
num_text.push_back(std::make_pair<int, std::string>(42, text));

// Cannot convert parameter 1 from 'int' to 'int &&'
num_text.push_back(std::make_pair<int, std::string>(num, std::string("Smeg")));

// Cannot convert parameter 1 from 'int' to 'int &&'
num_text.push_back(std::make_pair<int, std::string>(num, text));

// Works fine again
num_text.push_back(std::make_pair<int, std::string>(42, std::string("Smeg")));

私は VS 2012 を使用しており、VS 2008 で記述されたコードを貼り付けました。それと関係があるとは想像できませんが、元の (2008) コードには問題はありませんでした。

ここで何が起こっているのかを理解できないのはちょっとばかげている気がしますが、何と言えばいいのでしょうか。

4

4 に答える 4

26

リファレンスは次のように述べています。

template< class T1, class T2 >
std::pair<T1,T2> make_pair( T1 t, T2 u );           (until C++11)

template< class T1, class T2 >
std::pair<V1,V2> make_pair( T1&& t, T2&& u );       (since C++11)

戻り値の型が異なることに注意してください。また、次のようにも述べています。

推定される型 V1 および V2 は、 std::decay::type および std::decay::type (値によって渡される関数の引数に適用される通常の型変換) です。型 X の場合、推定される型は X& です。

実際、2008 年以降 (Visual C++ 2008 のことです)、関数のセマンティクスmake_pairが変更されました。からテンプレート パラメータを削除しstd::make_pairて型を推測させるかstd::pair、特定の型のペアを作成する必要がある場合は のコンストラクタを使用できます。

num_text.push_back(std::make_pair(num, text));               // deduced type
num_text.push_back(std::pair<int, std::string>(num, text));  // specific type

コンパイル エラーの理由は、型をint(as T1) およびstd::string(as ) に指定したため、関数はおよび をT2想定しているためです。それが問題である理由については、この回答を参照してください。T1 &&T2 &&

于 2013-10-14T10:40:39.403 に答える
2

現在std::make_pair、C++ 標準では次のように定義されています

template <class T1, class T2>

下記参照make_pair(**T1&&, T2&&**);

使わずにもっと簡単に書くことができますstd::make_pair

num_text.push_back( { 42, text } );.

于 2013-10-14T10:46:15.193 に答える