为什么不首选std :: initializer_list转换?

时间:2018-07-18 01:42:25

标签: c++ c++11 initializer-list overload-resolution

请考虑以下代码段:

s1
=================
a1 -> b1 -> c1
a2    b2    c2
a3          c3
a4

Live on Coliru

如果运行它,则可以看到#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 }})?

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>)