5

次の関数テンプレートがあります。

template <typename K, typename V>
void f(std::initializer_list<std::pair<const K, V>> il)
{
    //...
}

次のように関数を呼び出します。

f({std::pair<const int,int>(1,2), std::pair<const int,int>(3,4)});    //(a)

そしてそれはうまくいきます。

ただし、次のように呼び出してみると:

f({{1,2}, {3,4}});    //(b)

正しい型を推測できず、次のようなコンパイル エラーが発生します。

'no matching function for call to 'f(<brace-enclose initializer list>)
note candidate is:
note: template <class K, class V> void f(std::initializer_list<std::pair<const K, V>>)'

次のように呼び出すと:

f({std::pair<const int,int>(1,2), {3,4}});    //(c)

型推論は機能しますが、次のように呼び出してみると:

f({std::make_pair(1,2), {3,4}});   //(d) 

以前と同じコンパイル エラーが発生します。

私の質問は:

テンプレート型推定が (c) では機能するのに (d) では機能しないのはなぜですか?

(コンパイラは gcc v4.6.3、フラグ -std=c++11 付き)

同様の古いSOの投稿を見てきましたが、この質問に完全に答えているようには見えませんでした。

4

1 に答える 1

4

b)の問題は、コンパイラが型を推論できないことです。

{1,2}

d)initializer_list<int>の問題は、make_pairがペアの最初の部分にa を生成しないことです。const int

于 2014-09-14T15:31:55.630 に答える