is_trivially_copyable 在我实现的构造函数和默认构造函数之间的行为不同

Zha*_*ang 1 c++ templates

有 std::is_trivially_copyable 的演示代码 https://en.cppreference.com/w/cpp/types/is_trivially_copyable

void test()
{
    struct A {
        int m;
        A(const A& o):m(o.m){}
    };

    struct D {
        int m;

        D(D const&) = default; // -> trivially copyable
        D(int x) : m(x + 1) {}
    };

    std::cout << std::is_trivially_copyable<A>::value << '\n';
    std::cout << std::is_trivially_copyable<D>::value << '\n';
}
Run Code Online (Sandbox Code Playgroud)

A 是不可复制的,但 D 可以。我使用默认行为实现 A 的复制构造函数。是什么造成了这种差异?

str*_*r14 5

这是它在 C++ 中的定义方式: https://en.cppreference.com/w/cpp/language/copy_constructor#Trivial_copy_constructor

简单的复制构造函数 如果满足以下所有条件,则类 T 的复制构造函数是简单的:

  • 它不是用户提供的(即,它是隐式定义的或默认的);
  • T没有虚拟成员函数;
  • T 没有虚拟基类;
  • 为 T 的每个直接基选择的复制构造函数是微不足道的;
  • 为 T 的每个非静态类类型(或类类型数组)成员选择的复制构造函数是微不足道的;

非联合类的简单复制构造函数有效地复制参数的每个标量子对象(递归地包括子对象的子对象等),并且不执行其他操作。但是,不需要复制填充字节,甚至复制的子对象的对象表示也不需要相同,只要它们的值相同即可。

TriviallyCopyable 对象可以通过手动复制其对象表示来复制,例如使用 std::memmove。所有与 C 语言兼容的数据类型(POD 类型)都是可简单复制的。