以下构造函数是否被认为是微不足道的?
struct A
{
A() : a(nullptr) {}
private:
int* a;
};
这些examples让我有点困惑。使用c ++ 11,这也应该是可能的:
struct A
{
private:
int* a{nullptr};
};
和a
应正确初始化为nullptr
。这里我没有定义构造函数,但它应该与第一个实现具有相同的形式。这些课程中的任何一个都被视为微不足道的吗
我问的目的是,我是否可以预期自动生成移动/复制构造函数和赋值运算符。
答案 0 :(得分:8)
以下构造函数是否被认为是微不足道的?
A() : a(nullptr) {}
不,因为它是用户定义的。
struct A
{
private:
int* a{nullptr};
};
不,因为它为非静态成员提供了大括号初始化程序。
根据标准(强调我的):
12.1构造函数
....类
X
的默认构造函数是类X
的构造函数,可以在没有参数的情况下调用它。如果 类X
没有用户声明的构造函数,没有参数的构造函数被隐式声明为默认值(8.40)。
....默认构造函数是微不足道的 ,如果它不是用户提供的 ,如果:<...> - 其类中没有非静态数据成员具有支撑或等于初始化程序 ,并且...... ....
否则,默认构造函数是非平凡的。
我问的目的是,我是否可以预期自动生成移动/复制构造函数和赋值运算符。
当 @ M.M 和 @NicolBolas 发表评论时,这些构造函数和运算符的生成不会受到普通构造函数的影响。
规则有点复杂,不太一致。
仅当没有显式声明的复制构造函数时,才会生成复制构造函数。 (如果声明了移动构造函数或移动赋值运算符,它将被删除。)
同样,只有在没有明确声明的情况下才会生成复制赋值运算符。 (同样,如果声明了移动构造函数或移动赋值运算符,它将被删除。)
仅当没有显式声明的移动构造函数,移动运算符,复制构造函数,复制赋值和析构函数时,才会生成移动构造函数。
同样的规则适用于移动分配运算符。