具有空mem-initializer-list和空体的构造函数

时间:2015-10-16 20:24:43

标签: c++ constructor c++14 language-lawyer ctor-initializer

在哪里可以找到标准(C ++ 14)中的一个子句,声明用户定义的默认构造函数具有空的 mem-initializer-list 和一个空体调用默认构造函数每个基类和每个成员子对象。例如,请考虑以下代码:

#include <iostream>
class A{
public:
    A() {std::cout << "A" << '\n'; }
};

class Base{
public:
    Base() { std::cout << "Base" << '\n'; }
};

class Derived : public Base {
    A a;
public:
    Derived() {}
};

int main()
{
    Derived d;
}

BaseA的构造函数由用户声明的构造函数Derived()调用,其中包含一个空的mem-initializer-list和一个空体。

2 个答案:

答案 0 :(得分:4)

引用标准草案N4527 12.6.2 / 9初始化基础和成员[class.base.init] Emphasis Mine ):

  

在非委托构造函数中,如果给定可能构造的   子对象不是由 mem-initializer-id 指定的(包括案例   其中没有 mem-initializer-list ,因为构造函数没有    ctor-initializer ),然后

     

(9.1) - 如果实体是具有的实体是非静态数据成员    brace-or-equal-initializer

     

(9.1.1) - 构造函数的类是一个union(9.5),而不是其他的   该联合的变体成员由 mem-initializer-id

指定      

(9.1.2) - 构造函数的类不是union,如果是实体   是一个匿名工会的成员,该工会的其他成员都不是   由 mem-initializer-id 指定,实体初始化为   在8.5中指定;

     

(9.2) - 否则,如果该实体是匿名工会或变体   member(9.5),不执行初始化;

     

(9.3) - 否则,该实体默认初始化(8.5)。

注意:正如@Howard Hinnant在下面的评论中指出的那样,在C ++ 14(N4141)“最终确定”标准中,上述引用位于第8段而非第9段。 / p>

答案 1 :(得分:1)

问:你指的是什么版本的C ++ 14标准?

来自n4296:

  

https://isocpp.org/std/the-standard

     

注意:

     

在某些情况下,C ++实现隐式定义了   默认构造函数(12.1),复制构造函数(12.8),移动构造函数   (12.8),复制赋值运算符(12.8),移动赋值运算符   (12.8),或析构函数(12.4)成员函数。 - 注意

也;

  

类X的默认构造函数是类X的构造函数   要么没有参数,要么每个参数都不是函数   参数包有一个默认参数。如果没有用户声明   类X的构造函数,没有参数的构造函数   隐含地宣布为违约(8.4)。隐式声明的默认值   构造函数是其类的内联公共成员。