是用默认关键字trial指定的构造函数

Are constructors specified with the default keyword trivial?

本文关键字:构造函数 trial 默认 关键字      更新时间:2023-10-16

我知道,在其他事情中,必须隐式定义一个琐碎的构造函数。

当我们使用默认关键字时,这也适用吗?

假设我们指定了一个T()=默认构造函数,它被认为是用户提供的,还是被视为隐式构造函数?

是的,在第一次声明时默认的用户声明构造函数可能很琐碎:

struct Foo
{ 
    Foo() = default;
    Foo(int, int);
    char x;
};
#include <type_traits>
static_assert(std::is_trivially_constructible<Foo>::value, "Works");

该示例演示了如何在存在用户定义(非默认)构造函数的情况下定义POD类。

根据标准(12.1),"如果不是用户提供的,默认构造函数是微不足道的"(加上条件),以及(8.4.2):

如果函数是用户声明的,而不是显式默认的,则该函数是用户提供的,或者在其第一次声明时删除。

然而,请注意,默认构造函数的平凡性不仅仅取决于它的声明和定义。从12.1:扩展报价

如果默认构造函数不是用户提供的,并且:

--其类没有虚拟函数(10.3),也没有虚拟基类(10.1),并且

--其类的任何非静态数据成员都没有大括号或相等的初始值设定项,并且

--它类的所有直接基类都有琐碎的默认构造函数,并且

--对于类类型(或其数组)的类的所有非静态数据成员,每个此类都有一个琐碎的默认构造函数。

如果不定义隐式构造函数,则隐式构造函数由编译器提供。这是一个没有参数的默认构造函数,除非您希望拥有自己的带有或不带有参数的构造函数来精确控制对象实例数据成员的初始化。