【问题标题】:constructor initialization list execution order with delegated constructors带有委托构造函数的构造函数初始化列表执行顺序
【发布时间】:2013-01-29 06:01:55
【问题描述】:

我有一个棘手的 C++ 问题:当你有一个带有委托构造函数的构造函数初始化列表时,列表执行顺序是什么?

这里存在两个相互冲突的标准规则:
1.) 构造函数初始化列表不是按列表顺序执行,而是按项目的声明顺序执行。
2.) 构造函数初始化列表中的委托构造函数总是在“母构造函数”执行之前被调用。

哪条规则更好? (因为构造函数也是一个类项) 为什么这很重要:假设委托的构造函数重新初始化已由“母构造函数”初始化的项,反之亦然。

【问题讨论】:

    标签: list constructor initialization


    【解决方案1】:

    §12.6.2/6 说

    如果 mem-initializer-id 指定构造函数的类, 它应该是唯一的mem-initializer...一旦目标构造函数返回, 委托构造函数被执行。

    所以没有冲突,因为在委托构造函数之前不能初始化任何东西。委托构造函数只需调用该构造函数,运行目标构造函数的初始化程序列表,运行目标构造函数,然后运行主体构造函数。

    【讨论】:

    • 谢谢 - 但老实说,我不明白你的陈述是如何从你引用的文字中得出的。如果它是正确的并且我理解正确,这意味着:1)执行委托构造函数列表 2)执行委托构造函数主体 3)执行主体构造函数列表 4)执行主体构造函数主体
    • @BM 不,它只是 1)执行委托构造函数列表 2)执行委托构造函数主体 3)执行主体构造函数主体。主构造函数除了委派构造函数外不能有初始化列表,正如引号所示。
    • narf 我现在明白了 - 我想通过列表使用重新初始化作为功能 - 但我认为这将是一个危险的。非常感谢!
    • @BM 我不明白你的意思,但请记住,你可以这样做 struct S { int x = 0; }; 并且在 init-lists 中初始化的任何变量都不会使用你在声明中使用的值进行初始化.
    • 谢谢,但不幸的是我的问题更复杂:我有一个成员对象,它可以是不同的类型,因此可以有不同的构造函数,这些构造函数又具有非静态参数。所以我只需要使用初始化列表来初始化该对象,并且我有不同的“父构造函数”来处理可能的对象构造函数。
    猜你喜欢
    • 2011-05-01
    • 2012-11-15
    • 1970-01-01
    • 2012-03-19
    • 2010-11-17
    • 2022-06-10
    • 1970-01-01
    相关资源
    最近更新 更多