如何检查默认的 copy/move constructors/assignment 运算符?
How can I inspect the default copy/move constructors/assignment operators?
我如何找出我的 类' 默认构造函数、析构函数和 copy/move constructors/assignment 运算符的确切作用?
我知道 0/3/5 规则,想知道编译器为我做了什么。
如果重要的话,我对 >=C++17 感兴趣。
implicitly-defined copy constructor
... performs full member-wise copy of the object's bases and non-static members, in their initialization order, using direct initialization...
对于简单的结构:
struct A
{
int x;
std::string y;
double z;
};
copy-constructor 相当于:
A::A(A const& otherA)
: x(otherA.x), y(otherA.y), z(otherA.z)
{
}
它只是为每个成员和直接基础调用各自的操作class,没有别的。
例如隐式生成的复制分配调用每个成员的复制分配。
注意:
virtual
碱基总是由 most-derived class 初始化。任何基的 member-init-lists 中虚拟基的任何初始值设定项都将被忽略。示例:
struct A
{
int x;
A(int x) : x(x) {}
};
struct B : virtual A
{
B()
: A(1) // This is ignored when constructing C.
{}
};
struct C : B
{
C()
: A(2) // If A is not default-constructible, removing this causes an error.
{}
};
C c; // .x == 2
隐式生成的默认构造函数具有唯一的 属性(由在 class 主体中显式 =default
ed 的默认构造函数共享):如果对象是使用空 parentheses/braces 创建的,否则将未初始化的任何字段都被清零。示例:
struct A
{
int x;
// A() = default; // Has the same effect.
};
A f; // Uninitialized.
A g{}; // Zeroed.
A h = A{}; // Zeroed.
A i = A(); // Zeroed.
这适用于 scalar 类型,效果通过具有相同类型默认构造函数的成员 class 实例递归传播。
我如何找出我的 类' 默认构造函数、析构函数和 copy/move constructors/assignment 运算符的确切作用?
我知道 0/3/5 规则,想知道编译器为我做了什么。
如果重要的话,我对 >=C++17 感兴趣。
implicitly-defined copy constructor
... performs full member-wise copy of the object's bases and non-static members, in their initialization order, using direct initialization...
对于简单的结构:
struct A
{
int x;
std::string y;
double z;
};
copy-constructor 相当于:
A::A(A const& otherA)
: x(otherA.x), y(otherA.y), z(otherA.z)
{
}
它只是为每个成员和直接基础调用各自的操作class,没有别的。
例如隐式生成的复制分配调用每个成员的复制分配。
注意:
virtual
碱基总是由 most-derived class 初始化。任何基的 member-init-lists 中虚拟基的任何初始值设定项都将被忽略。示例:struct A { int x; A(int x) : x(x) {} }; struct B : virtual A { B() : A(1) // This is ignored when constructing C. {} }; struct C : B { C() : A(2) // If A is not default-constructible, removing this causes an error. {} }; C c; // .x == 2
隐式生成的默认构造函数具有唯一的 属性(由在 class 主体中显式
=default
ed 的默认构造函数共享):如果对象是使用空 parentheses/braces 创建的,否则将未初始化的任何字段都被清零。示例:struct A { int x; // A() = default; // Has the same effect. }; A f; // Uninitialized. A g{}; // Zeroed. A h = A{}; // Zeroed. A i = A(); // Zeroed.
这适用于 scalar 类型,效果通过具有相同类型默认构造函数的成员 class 实例递归传播。