mem初始化器中的大括号或等号初始化器

brace-or-equal-initializer in mem-initializer

本文关键字:初始化 mem      更新时间:2023-10-16

C++标准不允许mem初始值设定项中的大括号或相等初始值设定项(请参见[class.base.init])的"=initializer子句"形式。例如:

struct Foo {
    int x;
    Foo(int y): x = y {
    }
};

给出编译时错误。

为什么?如果允许这样的构造,会不会有一些句法歧义?如果没有,是否有建议将此功能添加到语言中?


更新。在这个上下文中,我期望这样一个初始化器的语义与在通常的变量初始化上下文中的语义相同。在我看来,这将使该语言的初始化语法更加一致。


更新2。正如NathanOliver所指出的,如果一个成员的初始化不依赖于所选的构造函数和/或构造函数参数,则可以通过默认的成员初始化器来初始化该成员(请参见[class.mem])。但如果是这样,则只能使用直接或列表初始化。

正如其他人所说,这很简单,在ctor初始化中不允许使用语法。

注意,对于非基元类,ctor() : xyz(...)形式的初始化实际上是对成员xyz类型的ctor调用。而ctor(): xyz{...}用于数组/列表的聚合初始化,或用于没有actor的结构/联合的成员初始化。

ctor() : xyz = something似乎必须做两件事:1)默认的ctor调用,2)然后为成员xyz的类型调用operator=,所有这些都是双重初始化。这可能就是它被禁止的原因。当然,对于非原始情况,我想它可以简化为copy-ctor调用,以消除双重初始化。

现在,您可能会说服一些人,只允许基元类型使用它是可以的,但这可能会给语言和编译器带来其他复杂性。