mem-initializer中的brace-or-equal-initializer

时间:2016-07-21 16:28:34

标签: c++ syntax initialization

C ++标准不允许" = initializer-clause " mem-initializer brace-or-equal-initializer 的形式(参见[dcl.init])(参见[class.base.init])。例如:

struct Foo {
    int x;

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

给出了编译时错误。

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

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

更新2.正如NathanOliver所指出的,如果成员的初始化不依赖于所选的构造函数和/或构造函数参数,则可以通过默认成员初始化程序初始化此成员(请参阅[class.mem])。但如果确实如此,它会让我们使用直接或列表初始化。

1 个答案:

答案 0 :(得分:0)

就像其他人所说的那样,在ctor初始化中很简单,不是一种允许的语法。

请注意,对于非原始类,ctor() : xyz(...)形式的初始化实际上是对成员xyz类型的调用。 ctor(): xyz{...}用于数组/列表的aggregate initialization或者没有ctors的结构/联合的成员初始化。

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

现在,您可能会说服某些人只允许原始类型,但这可能会在语言和编译器中引入其他复杂情况。