【问题标题】:Constructor with an empty mem-initializer-list and an empty body具有空 mem-initializer-list 和空主体的构造函数
【发布时间】:2015-10-16 20:24:43
【问题描述】:

我在哪里可以在标准 (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 和空主体。

【问题讨论】:

  • 12.6 可能会涵盖这一点
  • 我的第一个猜测是......你会在文本附近的某个地方找到关于 mem-initializer 列表和基类的初始化及其顺序等的文本。

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


【解决方案1】:

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

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

(9.1) — 如果实体是具有 brace-or-equal-initializer 和任一

(9.1.1) — 构造函数的类是联合 (9.5),没有其他类 该联合的变体成员由 mem-initializer-id

指定

(9.1.2) — 构造函数的类不是联合,并且,如果实体 是匿名工会的成员,该工会的其他成员都不是 由 mem-initializer-id 指定,实体被初始化为 8.5中规定;

(9.2) — 否则,如果实体是匿名联合或变体 成员(9.5),不执行初始化;

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

注意:正如@Howard Hinnant 在下面的 cmets 中指出的那样,在 C++14 (N4141)“最终”标准中,上述引用位于第 8 段而不是第 9 段。

【讨论】:

  • 在 C++14 (N4141) 中,这是 p8 而不是 p9,否则看起来不错! +1 :-)
  • @HowardHinnant 感谢您的指出,不幸的是我没有 C++14 标准的副本。不过我会添加一个注释。
【解决方案2】:

问:您具体指的是哪个版本的 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)。隐式声明的默认值 构造函数是其类的内联公共成员。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-10-14
    • 1970-01-01
    • 2013-06-25
    • 1970-01-01
    相关资源
    最近更新 更多