如何检查默认的 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 主体中显式 =defaulted 的默认构造函数共享):如果对象是使用空 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 实例递归传播。