值初始化

Chu*_*dad 3 c++ language-lawyer c++11

$ 8.5/7表示

- 如果T是一个(可能是cv限定的)非联合类类型而没有用户提供的构造函数,那么该对象是零初始化的,如果T的隐式声明的默认构造函数是非平凡的,则调用该构造函数.

我无法理解这句话的最后一部分"如果T隐式声明的默认构造函数是非平凡的,那么构造函数就被调用了."

有人可以用一个例子解释一下吗?

class A
{
    int x;
};

class B : A {};

B b{};
Run Code Online (Sandbox Code Playgroud)

我认为B在上面的代码中有一个非平凡的构造函数.但是我如何观察对B隐式声明的构造函数的调用并确保我的编译器正在调用它?

Mik*_*our 6

我认为上面代码中的B有一个非平凡的构造函数.

在您的示例中,构造函数是微不足道的.

查看C++ 11 12.1/5中的条件,这两个类都没有用户声明的构造函数,虚函数,虚基类,具有初始化的成员或类类型的成员; A没有基类,B只有一个简单的基类.

但是我如何观察对B的隐式声明构造函数的调用并确保我的编译器正在调用它?

使用隐式但非平凡的默认构造函数创建类的一种方法是使用一个非平凡的成员或基类:

struct A {
    // A user-declared constructor is non-trivial
    A() {std::cout << "Construct A\n";}
};

struct B : A {};
Run Code Online (Sandbox Code Playgroud)

现在你可以(间接)观察B被调用的隐式构造函数,通过在调用构造函数时观察副作用A.