繁体   English   中英

具有类内初始化的默认默认构造函数的行为是什么?

[英]What is the behavior of a defaulted default constructor with in-class initialization?

假设如下:

class foo
{
public:
  foo() = default;

private:
  std::string m_str = "Hello";
};

我无法在cppreference.com或C ++ 11草案中找到任何文档,它解释了默认构造函数在这里对m_str做了什么。 我自然的假设是,如果已经在类中初始化了编译器,那么编译器足够聪明,不能在默认构造函数中初始化m_str ,但也许我错了。

谁能解释这里的初始化行为? 任何保证还是未指明?

这在[class.ctor] / 5中定义明确并指定:

[...]隐式定义的默认构造函数执行该类的初始化集合,该集合将由用户编写的该类的默认构造函数执行,不包含ctor-initializer(12.6.2)和空复合语句。 [...]

因此,默认构造函数执行与以下相同的操作:

foo() {}

这反过来又适用于每个数据成员(参见[class.base.init] / 8)。

您用于m_str的初始化形式称为标准的brace-or-equal-initializer

Inativeizers下的第一段中,标准规定:

8.5初始化者

1声明者可以为声明的标识符指定初始值。 标识符指定要初始化的变量。 8.5的其余部分中描述的初始化过程也适用于由其他语法上下文指定的初始化,例如使用argumet表达式(5.2.2)初始化函数参数或初始化返回值(6.6.3)。

 \n          初始化: \n              大括号或相等的初始值设定 \n              (表达式列表) \n          大括号或相等的初始值设定: \n              = initializer-clause \n              支撑-初始化列表 \n\n

在关于班级成员的部分......

9.2班级成员

5可以使用大括号或等号初始化程序初始化成员。

在关于初始化基础和成员的部分中......

12.6.2初始化基础和成员

8在非委托构造函数中,如果给定的非静态数据成员或基类未由mem-initializer-id指定(包括没有mem-initializer-list的情况,因为构造函数没有ctor-initializer然后,实体不是抽象类(10.4)的虚基类

- 如果实体是具有大括号或等于初始化程序的非静态数据成员,则实体初始化为8.5中指定的

来到你的班级,

foo() = default;

相当于:

foo(){}

如果使用没有成员初始值设定项列表的默认构造函数,则会默认初始化成员数据。 在默认初始化过程中,对于具有大括号或等于初始化程序的成员,该表单用于初始化它们。 在你的情况下,

foo(){}

相当于:

foo() : m_str("Hello") {}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM