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

时间:2016-06-29 23:09:04

标签: c++ c++11 constructor

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

struct A
{
    A() : a(nullptr) {}
private:
    int* a;
};

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

struct A
{
private:
    int* a{nullptr};
};

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

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

1 个答案:

答案 0 :(得分:8)

  

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

A() : a(nullptr) {}

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

struct A
{
private:
    int* a{nullptr};
};

不,因为它为非静态成员提供了大括号初始化程序。

根据标准(强调我的):

  

12.1构造函数
....

     

X的默认构造函数是类X的构造函数,可以在没有参数的情况下调用它。如果   类X没有用户声明的构造函数,没有参数的构造函数被隐式声明为默认值(8.40)。
....

     

默认构造函数是微不足道的 ,如果它不是用户提供的 ,如果:<...>    - 其类中没有非静态数据成员具有支撑或等于初始化程序 ,并且...... ....

     

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

  

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

@ M.M @NicolBolas 发表评论时,这些构造函数和运算符的生成不会受到普通构造函数的影响。

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

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

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

仅当没有显式声明的移动构造函数,移动运算符,复制构造函数,复制赋值和析构函数时,才会生成移动构造函数

同样的规则适用于移动分配运算符