C ++ 11统一初始化:初始化列表和多参数构造函数之间的歧义?

蒂莫西·卡纳尔斯基(Timothy Kanarsky)

目前,我试图绕过C ++ 11的统一初始化。我遇到了这种模棱两可的情况:考虑一个可以从两个参数的构造函数或任意长度的初始化列表构造的类:

class Foo {
  public:
    Foo(int a, int b) {
      std::cout << "constructor 1" << std::endl;
    }
    Foo(std::initializer_list<int>) {
      std::cout << "constructor 2" << std::endl;
    }
};

遵循统一的初始化约定,我希望以下工作正常:

Foo a (1, 2)印刷品constructor 1(duh)

Foo b {1, 2} 版画 constructor 1

Foo c = {1, 2} 版画 constructor 2

但是,似乎编译器将其解释Foo b {1, 2}为列表初始化,然后调用构造函数2。()当存在initializer-list构造函数时,语法是否是强制编译器考虑其他类型的构造函数的唯一方法?

安德烈亚斯(Andreas DM)

似乎编译器将Foo b {1,2}解释为列表初始化,并调用构造函数2。()语法是否是存在Initializer-list构造函数时迫使编译器考虑其他类型构造函数的唯一方法?

标准草案的引言很好地解释了这一点:

9.4.5.2 [dcl.init.list](强调我的):

如果构造函数的第一个参数的类型为std ::: initializer_list或对某些类型E的cv std :: initializer_list的引用,则构造函数为Initializer-list构造函数,并且没有其他参数或所有其他参数都具有默认值参数([dcl.fct.default])。

[注2:在列表初始化([over.match.list])中,Initializer-list构造函数优于其他构造函数。将初始化程序列表作为参数传递给类C的构造函数模板模板C(T)不会创建初始化程序列表构造函数,因为初始化程序列表参数会使对应的参数成为非推导上下文([temp.deduct 。呼叫])。—尾注]

12.4.2.8 [over.match.list]

当非聚合类类型T的对象被列表初始化,从而[dcl.init.list]指定根据本小节中的规则执行重载解析时,或者根据[over.ics]形成列表初始化序列时。列表],重载解析分两个阶段选择构造函数:

  • 如果初始值设定项列表不为空或T没有默认构造函数,则首先执行重载解析,其中候选函数为类T的初始值设定项列表构造函数([dcl.init.list]),并且参数列表由初始值设定项组成列出为单个参数。

  • 否则,或者如果找不到可行的initializer-list构造函数,则再次执行重载解析,其中候选函数是T类的所有构造函数,而参数列表由Initializer列表的元素组成。

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

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

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

C ++ 11统一初始化和函数重载

来自分类Dev

C ++ 11使可变参数构造函数了解初始化列表的初始化列表

来自分类Dev

类C,构造函数和统一初始化之间有什么区别?

来自分类Dev

C ++中的初始化程序列表和类初始化。我有无参数构造函数,但仍必须使用初始化列表?

来自分类Linux

C ++ 11成员初始化列表歧义

来自分类Dev

C ++ 11统一初始化:字段初始化器不是常量

来自分类Dev

为什么显式声明的构造函数阻止使用C ++ 11初始化列表进行成员初始化?

来自分类Dev

C ++初始化构造函数初始化器列表中的模板数组

来自分类Dev

C ++初始化字段直接与默认构造函数中的初始化列表

来自分类Dev

C ++构造函数:在初始化列表之前初始化局部变量

来自分类Dev

C ++ 11在constexpr函数中使用统一值初始化数组

来自分类Dev

c ++构造函数成员初始化:传递参数

来自分类Dev

C ++:构造函数按初始化列表的顺序

来自分类Dev

C ++:具有初始化列表的默认构造函数

来自分类Dev

当parens初始化时,构造函数初始化列表中的C ++ 11大括号初始化为什么不起作用?

来自分类Dev

C ++使用其他参数获取构造函数的初始化程序列表

来自分类Dev

使用初始化列表时检查传递给构造函数的参数-C ++

来自分类Dev

如何使用std :: array构造函数参数C ++列表初始化const std :: array成员

来自分类Dev

为什么可变参数函数不能“吃掉” C ++ 11中的列表初始化参数?

来自分类Dev

C ++初始化程序列表重载消除歧义

来自分类Dev

CRTP 基私有构造函数和派生的友元类使用 C++17 和统一初始化导致编译错误

来自分类Dev

具有统一初始化语法的自动类型推导c ++ 11 vs c ++ 17

来自分类Dev

C++17 几乎统一的初始化

来自分类Dev

非聚集上的C ++ 14统一初始化

来自分类Dev

c++ 继承(无基构造函数)没有初始化列表(低于 c++ 11)?

来自分类Dev

如何在Objective C的参数化构造函数中初始化NSDate?

来自分类Dev

Eclipse格式不正确的C ++ 11统一初始化

来自分类Dev

如果构造函数是初始化的,如何初始化对象的数组?C ++

来自分类Dev

在构造函数中初始化的变量未保持初始化状态(C ++)

Related 相关文章

  1. 1

    C ++ 11统一初始化和函数重载

  2. 2

    C ++ 11使可变参数构造函数了解初始化列表的初始化列表

  3. 3

    类C,构造函数和统一初始化之间有什么区别?

  4. 4

    C ++中的初始化程序列表和类初始化。我有无参数构造函数,但仍必须使用初始化列表?

  5. 5

    C ++ 11成员初始化列表歧义

  6. 6

    C ++ 11统一初始化:字段初始化器不是常量

  7. 7

    为什么显式声明的构造函数阻止使用C ++ 11初始化列表进行成员初始化?

  8. 8

    C ++初始化构造函数初始化器列表中的模板数组

  9. 9

    C ++初始化字段直接与默认构造函数中的初始化列表

  10. 10

    C ++构造函数:在初始化列表之前初始化局部变量

  11. 11

    C ++ 11在constexpr函数中使用统一值初始化数组

  12. 12

    c ++构造函数成员初始化:传递参数

  13. 13

    C ++:构造函数按初始化列表的顺序

  14. 14

    C ++:具有初始化列表的默认构造函数

  15. 15

    当parens初始化时,构造函数初始化列表中的C ++ 11大括号初始化为什么不起作用?

  16. 16

    C ++使用其他参数获取构造函数的初始化程序列表

  17. 17

    使用初始化列表时检查传递给构造函数的参数-C ++

  18. 18

    如何使用std :: array构造函数参数C ++列表初始化const std :: array成员

  19. 19

    为什么可变参数函数不能“吃掉” C ++ 11中的列表初始化参数?

  20. 20

    C ++初始化程序列表重载消除歧义

  21. 21

    CRTP 基私有构造函数和派生的友元类使用 C++17 和统一初始化导致编译错误

  22. 22

    具有统一初始化语法的自动类型推导c ++ 11 vs c ++ 17

  23. 23

    C++17 几乎统一的初始化

  24. 24

    非聚集上的C ++ 14统一初始化

  25. 25

    c++ 继承(无基构造函数)没有初始化列表(低于 c++ 11)?

  26. 26

    如何在Objective C的参数化构造函数中初始化NSDate?

  27. 27

    Eclipse格式不正确的C ++ 11统一初始化

  28. 28

    如果构造函数是初始化的,如何初始化对象的数组?C ++

  29. 29

    在构造函数中初始化的变量未保持初始化状态(C ++)

热门标签

归档