为什么使用带括号的初始化程序列表时首选std :: initializer_list构造函数?

虚拟软件公司

考虑代码

#include <iostream>

class Foo
{
    int val_;
public:
    Foo(std::initializer_list<Foo> il)
    {
        std::cout << "initializer_list ctor" << std::endl;
    }
    /* explicit */ Foo(int val): val_(val)
    {
        std::cout << "ctor" << std::endl;
    };
};

int main(int argc, char const *argv[])
{
    // why is the initializer_list ctor invoked?
    Foo foo {10}; 
}

输出是

ctor
initializer_list ctor

据我了解,该值10隐式转换为Foo(第一个ctor输出),然后初始化构造函数插入(第二个initializer_list ctor输出)。我的问题是为什么会这样?标准构造函数Foo(int)不是更好的选择吗?即,我希望该代码段的输出为just ctor

PS:如果我将构造函数标记Foo(int)explicit,则Foo(int)是唯一调用的构造函数,因为10现在无法将整数隐式转换为Foo

TC

§13.3.1.7[over.match.list] / p1:

当非聚合类类型的对象T被列表初始化(8.5.4)时,重载解析会分两个阶段选择构造函数:

  • 最初,候选函数是该类的初始化器列表构造函数(8.5.4),T并且参数列表由作为单个参数的初始化器列表组成。
  • 如果找不到可行的初始化程序列表构造函数,则再次执行重载解析,其中候选函数是该类的所有构造函数,T并且参数列表由初始化程序列表的元素组成。

如果初始化列表没有元素,并且T具有默认构造函数,则省略第一阶段。在复制列表初始化中,如果explicit选择构造函数,则初始化格式不正确。

只要有可行的initializer-list构造函数,当使用list-initialization并且initializer列表包含至少一个元素时,它将胜过所有非initializer-list构造函数。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

为什么这个initializer_list构造函数是可行的重载?

来自分类Dev

如何防止std :: string使用initializer_list构造函数?

来自分类Dev

std :: initializer_list作为std :: array构造函数

来自分类Dev

std :: initializer_list作为构造函数的模板参数

来自分类Dev

构造函数中的std :: initializer_list转换

来自分类Dev

为什么使用std :: initializer_list的构造函数不喜欢使用双花括号语法

来自分类Dev

显式构造函数和std :: initializer_list初始化

来自分类Dev

initializer_list在此构造函数中允许什么样的初始化?

来自分类Dev

无法从<括号括起来的初始化程序列表>中推导std :: initializer_list

来自分类Dev

稍后添加initializer_list构造函数时,使用大括号初始化语法会改变构造行为吗?

来自分类Dev

嵌套列表初始化与以initializer_list为第二个参数的构造函数不匹配

来自分类Dev

如何使用带有std :: initializer_list的构造函数设计类?

来自分类Dev

std :: initializer_list作为模板类中的构造函数参数

来自分类Dev

如何不使用std :: initializer_list定义初始值设定项列表构造函数?

来自分类Dev

在模板函数中使用initializer_list

来自分类Dev

在模板函数中使用initializer_list

来自分类Dev

使用std :: initializer_list参数的非成员函数(/非构造函数上下文)的重载解析

来自分类Dev

为什么不能用括号括起来的初始化程序列表构造gsl :: span

来自分类Dev

从initializer_list错误构造一个std :: map

来自分类Dev

类支撑初始化被误解为std :: initializer_list而不是副本构造

来自分类Dev

为什么在VS2019中初始化std :: initializer_list似乎失败

来自分类Dev

我可以使用std :: initializer_list而不是括号括起来的初始化程序来初始化数组吗?

来自分类Dev

具有initializer_list和size的std :: unordered_map构造函数在main中进行编译,但在类定义中未进行编译

来自分类Dev

从std :: array私有继承时,无法从std :: initializer_list构造

来自分类Dev

使用直接初始化与std :: initializer_list时的不同指令

来自分类Dev

std :: initializer_list的实现

来自分类Dev

C ++ 11可以构造一个std :: initializer_list吗?

来自分类Dev

是否可以在构造函数的初始化程序列表中初始化std :: unique_ptr的std :: array?

来自分类Dev

不能使用std :: initializer_list调用new运算符进行列表初始化吗?

Related 相关文章

  1. 1

    为什么这个initializer_list构造函数是可行的重载?

  2. 2

    如何防止std :: string使用initializer_list构造函数?

  3. 3

    std :: initializer_list作为std :: array构造函数

  4. 4

    std :: initializer_list作为构造函数的模板参数

  5. 5

    构造函数中的std :: initializer_list转换

  6. 6

    为什么使用std :: initializer_list的构造函数不喜欢使用双花括号语法

  7. 7

    显式构造函数和std :: initializer_list初始化

  8. 8

    initializer_list在此构造函数中允许什么样的初始化?

  9. 9

    无法从<括号括起来的初始化程序列表>中推导std :: initializer_list

  10. 10

    稍后添加initializer_list构造函数时,使用大括号初始化语法会改变构造行为吗?

  11. 11

    嵌套列表初始化与以initializer_list为第二个参数的构造函数不匹配

  12. 12

    如何使用带有std :: initializer_list的构造函数设计类?

  13. 13

    std :: initializer_list作为模板类中的构造函数参数

  14. 14

    如何不使用std :: initializer_list定义初始值设定项列表构造函数?

  15. 15

    在模板函数中使用initializer_list

  16. 16

    在模板函数中使用initializer_list

  17. 17

    使用std :: initializer_list参数的非成员函数(/非构造函数上下文)的重载解析

  18. 18

    为什么不能用括号括起来的初始化程序列表构造gsl :: span

  19. 19

    从initializer_list错误构造一个std :: map

  20. 20

    类支撑初始化被误解为std :: initializer_list而不是副本构造

  21. 21

    为什么在VS2019中初始化std :: initializer_list似乎失败

  22. 22

    我可以使用std :: initializer_list而不是括号括起来的初始化程序来初始化数组吗?

  23. 23

    具有initializer_list和size的std :: unordered_map构造函数在main中进行编译,但在类定义中未进行编译

  24. 24

    从std :: array私有继承时,无法从std :: initializer_list构造

  25. 25

    使用直接初始化与std :: initializer_list时的不同指令

  26. 26

    std :: initializer_list的实现

  27. 27

    C ++ 11可以构造一个std :: initializer_list吗?

  28. 28

    是否可以在构造函数的初始化程序列表中初始化std :: unique_ptr的std :: array?

  29. 29

    不能使用std :: initializer_list调用new运算符进行列表初始化吗?

热门标签

归档