是一个空构造函数,初始化列表被认为是微不足道的吗?

pin*_*gul 3 c++ constructor c++11

以下构造函数是否被认为是微不足道的?

struct A
{
    A() : a(nullptr) {}
private:
    int* a;
};
Run Code Online (Sandbox Code Playgroud)

这些例子让我有点困惑.使用c ++ 11,这也应该是可能的:

struct A
{
private:
    int* a{nullptr};
};
Run Code Online (Sandbox Code Playgroud)

a应正确初始化为nullptr.这里我没有定义构造函数,但它应该与第一个实现具有相同的形式.这些课程中的任何一个都被视为微不足道的吗

我问的目的是我是否可以预期自动生成移动/复制构造函数和赋值运算符.

Ale*_*exD 8

以下构造函数是否被认为是微不足道的?

A() : a(nullptr) {}
Run Code Online (Sandbox Code Playgroud)

不,因为它是用户定义的.

struct A
{
private:
    int* a{nullptr};
};
Run Code Online (Sandbox Code Playgroud)

不,因为它为非静态成员提供了大括号初始值设定项.

根据标准(强调我的):

12.1建设者
......

类的默认构造函数是类X的构造函数X,可以在没有参数的情况下调用.如果没有用户声明的类X构造函数,则不会将没有参数的构造函数隐式声明为defaultaulted(8.40).
....

如果它不是用户提供的,则默认构造函数是微不足道的,如果:
....
- 其类的非静态数据成员没有大括号或等于初始值,并且
......

否则,默认构造函数是非平凡的.


我问的目的是我是否可以预期自动生成移动/复制构造函数和赋值运算符.

正如@MM@NicolBolas评论的那样,这些构造函数和运算符的生成不会受到普通构造函数的影响.

规则有点复杂,不太一致.

仅当没有显式声明的复制构造函数时,才会生成复制构造函数.(如果声明了移动构造函数或移动赋值运算符,它将被删除.)

类似地,只有在没有显式声明的情况下才会生成复制赋值运算符.(同样,如果声明了移动构造函数或移动赋值运算符,它将被删除.)

移动构造函数只产生,如果没有显式声明的移动构造函数,移动运营商拷贝构造函数,拷贝赋值和析构函数.

移动赋值运算符的规则相同.