首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >类内成员初始化器和初始化列表之间的冲突解决方案

类内成员初始化器和初始化列表之间的冲突解决方案
EN

Stack Overflow用户
提问于 2014-04-10 14:35:08
回答 1查看 221关注 0票数 0

让我在这个问题之前加上以下代码:

代码语言:javascript
运行
复制
struct A
{
  explicit A(int i):a_{i} {}

  int a_
};

struct B
{
  B():mya_{5} {} // Initialize mya_ (again?)

  A mya_{7}; // Initialize mya_
};

struct B中,mya_的类内初始化器与B构造函数的初始化程序列表中的mya_之间存在冲突。根据C++标准,这是如何解决的?当B的构造完成时,mya_.a_的最终值应该是多少?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2014-04-10 14:37:16

初始化列表获胜。如果您有另一个未初始化成员的构造函数,就地初始化将获胜。

例如,

代码语言:javascript
运行
复制
struct B
{
  B():mya_{5} {}
  B(int) {}
  A mya_{7};
};

int main
{
  B b0;    // b.mya_.a_ is 5
  B b(42); // b.mya_.a_ is 7
}

12.6.2初始化基和成员class.base.init

如果给定的非静态数据成员同时具有大括号或等初始化器和mem初始化器,则执行mem初始化程序指定的初始化,忽略非静态数据成员的大括号或等初始化器。[例子:给予

代码语言:javascript
运行
复制
struct A {
int i = /∗ some integer expression with side effects ∗/ ;
A(int arg) : i(arg) { }
// ...
};

A(int)构造函数将I简单地初始化为arg的值,并且I的支撑或相等初始化器中的副作用不会发生。-最终例子]

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

https://stackoverflow.com/questions/22991180

复制
相关文章

相似问题

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