TPJ*_*TPJ 5 c++ templates initializer-list c++11 template-argument-deduction
我有以下功能模板:
template <typename K, typename V>
void f(std::initializer_list<std::pair<const K, V>> il)
{
//...
}
Run Code Online (Sandbox Code Playgroud)
我把这个函数调用如下:
f({std::pair<const int,int>(1,2), std::pair<const int,int>(3,4)}); //(a)
Run Code Online (Sandbox Code Playgroud)
它工作正常.
但是,如果我尝试按如下方式调用它:
f({{1,2}, {3,4}}); //(b)
Run Code Online (Sandbox Code Playgroud)
它无法推断出正确的类型,并且我得到了一个编译错误:
'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>>)'
Run Code Online (Sandbox Code Playgroud)
如果我这样称呼如下:
f({std::pair<const int,int>(1,2), {3,4}}); //(c)
Run Code Online (Sandbox Code Playgroud)
类型推导有效,但如果我尝试按如下方式调用它:
f({std::make_pair(1,2), {3,4}}); //(d)
Run Code Online (Sandbox Code Playgroud)
我得到与以前相同的编译错误.
我的问题是:
为什么模板类型推导在(c)中有效而在(d)中不起作用?
(编译器是gcc v4.6.3,带标志-std = c ++ 11)
我看过类似的,较旧的SO帖子,但他们似乎没有完全回答这个问题.
b)的问题是编译器无法推断类型,因为类似
{1,2}
Run Code Online (Sandbox Code Playgroud)
也可能被视为 an , d)initializer_list<int>的问题是make_pair不会为该对的第一部分生成 aconst int