首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >均方根中的支撑式或等式初始化器

均方根中的支撑式或等式初始化器
EN

Stack Overflow用户
提问于 2016-07-21 16:28:34
回答 1查看 350关注 0票数 0

C++标准不允许mem-初始化器(参见class.base.init)中的"=初始化-子句“形式的大括号或等初始化器(参见dcl.init)。例如:

代码语言:javascript
复制
struct Foo {
    int x;

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

给出编译时错误。

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

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

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

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-07-21 17:15:20

就像其他人说的,在ctor初始化中,这是一个简单的不允许的语法。

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

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

现在,您也许可以让一些人相信,只允许使用原语类型是可以的,但这可能会给语言和编译器带来其他复杂因素。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/38509607

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档