C++标准不允许mem-初始化器(参见class.base.init)中的"=初始化-子句“形式的大括号或等初始化器(参见dcl.init)。例如:
struct Foo {
int x;
Foo(int y): x = y {
}
};给出编译时错误。
为什么会这样呢?如果允许这样的结构,会不会有一些句法歧义?如果没有,是否有建议将这一特性添加到语言中?
更新。在这个上下文中,我期望这种初始化器的语义与通常的变量初始化上下文中的语义相同。在我看来,这将使语言的初始化语法更加一致。
更新2.正如NathanOliver所指出的,如果成员的初始化不依赖于所选的构造函数和/或构造函数参数,则可以通过默认的成员初始化器(参见class.mem)初始化该成员。但是如果是这样的话,我们就只能使用直接或列表初始化了。
发布于 2016-07-21 17:15:20
就像其他人说的,在ctor初始化中,这是一个简单的不允许的语法。
注意,对于非原始类,初始化的ctor() : xyz(...)形式实际上是对成员xyz类型的ctor调用。ctor(): xyz{...}用于数组/列表的聚合初始化或没有ctors的结构/联合的成员初始化。
ctor() : xyz = something似乎必须做两件事: 1)默认的ctor调用;2)然后为成员xyz的类型调用operator=,所有这些都是双重初始化。这可能就是不允许这样做的原因。当然,对于非原始情况,我想可以简化为copy-ctor调用,以消除双重初始化。
现在,您也许可以让一些人相信,只允许使用原语类型是可以的,但这可能会给语言和编译器带来其他复杂因素。
https://stackoverflow.com/questions/38509607
复制相似问题