构造函数是否使用默认关键字trivial指定?

时间:2014-04-11 08:27:46

标签: c++ constructor default

我知道除其他外,必须隐式定义一个简单的构造函数。

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

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

2 个答案:

答案 0 :(得分:4)

是的,在第一个声明中默认的用户声明的构造函数可能很简单:

struct Foo
{ 
    Foo() = default;
    Foo(int, int);

    char x;
};

#include <type_traits>
static_assert(std::is_trivially_constructible<Foo>::value, "Works");

该示例演示了即使存在用户定义(非默认)构造函数也如何定义POD类。

从标准(12.1),&#34;默认构造函数是微不足道的,如果它不是用户提供的&#34; (加条件)和(8.4.2):

  

如果某个函数是用户声明的,并且没有明确默认,则该函数是用户提供的   删除了第一份声明。

但是,请注意,默认构造函数的不重要性不仅仅取决于其声明和定义。要扩展12.1的引用:

  

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

,则默认构造函数是微不足道的      

- 它的类没有虚函数(10.3),没有虚基类(10.1)和

     

- 其类的非静态数据成员没有大括号或等于初始值,

     

- 其类的所有直接基类都有简单的默认构造函数和

     

- 对于类类的所有非静态数据成员(或其数组),每个这样的类都有一个普通的默认构造函数。

答案 1 :(得分:0)

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