请考虑以下代码段:
s1
=================
a1 -> b1 -> c1
a2 b2 c2
a3 c3
a4
如果运行它,则可以看到#include <iostream>
#include <vector>
void f(std::vector<int>){std::cout << __PRETTY_FUNCTION__ << '\n';}
void f(int x){std::cout << __PRETTY_FUNCTION__ << '\n';}
int main()
{
f({42});
}
重载是首选的,即使f(int)
有一个std::initializer_list
constructor(请参阅#8)。
问题:为什么更倾向于将std::vector
转换为{42}
(而不是转换为int
,因为std::vector
是{{1 }})?
答案 0 :(得分:16)
在重载解析中,当考虑implicit conversion sequence in list-initialization时,
(重点是我的)
否则,如果参数类型不是类和初始化程序 列表有一个元素,则隐式转换顺序就是一个 将元素转换为参数类型所需的
给出f({42});
,对于f(int)
,隐式转换序列是将元素(即42
)转换为int
的序列,这是完全匹配的;对于f(std::vector<int>)
,需要进行用户定义的转换(将std::initializer_list<int>
转换为std::vector<int>
),然后再进行匹配。
PS:如果支撑初始化程序包含多个元素,例如{42, 42}
,则将选择f(std::vector<int>)
。