代码之家  ›  专栏  ›  技术社区  ›  vsoftco

为什么STD::初始化列表列表转换不是首选?

  •  11
  • vsoftco  · 技术社区  · 8 年前

    请考虑以下代码段:

    #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});
    }
    

    Live on Coliru

    如果你运行它,你可以看到 f(int) 超载是首选,即使 std::vector 有一个 std::initializer_list constructor (见8)。

    问题 :为什么要转换 {42} 到 int 首选(而不是转换为 STD::载体 作为 { 42 } 是一个 STD:初始化文件列表 ?

    1 回复  |  直到 8 年前
        1
  •  16
  •   songyuanyao    8 年前

    在过载分辨率中,当考虑 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::向量& lt;int & gt; 将被选中。