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.这里我没有定义构造函数,但它应该与第一个实现具有相同的形式.这些课程中的任何一个都被视为微不足道的吗
我问的目的是我是否可以预期自动生成移动/复制构造函数和赋值运算符.
以下构造函数是否被认为是微不足道的?
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评论的那样,这些构造函数和运算符的生成不会受到普通构造函数的影响.
规则有点复杂,不太一致.
仅当没有显式声明的复制构造函数时,才会生成复制构造函数.(如果声明了移动构造函数或移动赋值运算符,它将被删除.)
类似地,只有在没有显式声明的情况下才会生成复制赋值运算符.(同样,如果声明了移动构造函数或移动赋值运算符,它将被删除.)
该移动构造函数只产生,如果没有显式声明的移动构造函数,移动运营商拷贝构造函数,拷贝赋值和析构函数.
移动赋值运算符的规则相同.