次の関数テンプレートがあります。
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の投稿を見てきましたが、この質問に完全に答えているようには見えませんでした。