=default 和没有参数的空构造函数之间的区别? [复制]

Posted

技术标签:

【中文标题】=default 和没有参数的空构造函数之间的区别? [复制]【英文标题】:Difference between =default and empty constructor with no arguments? [duplicate] 【发布时间】:2014-01-16 14:33:27 【问题描述】:

=default 和不带参数的空构造函数之间的区别?

有没有区别:

MyClass() 
MyClass() = default;

【问题讨论】:

我相信第一个构造函数是不平凡的,而第二个是微不足道的。 【参考方案1】:

总体没有。 ;)

总体上会做同样的事情,但不完全一样(就像 sftrabbit、Nawaz 和 0x499602D2 建议的那样,顺便感谢一下)。

您将找到问题的答案here ;)

【讨论】:

它会做同样的事情,但会改变类的某些属性(比如它是否微不足道)。 它们并不完全相同。它们都将为std::is_trivial<T>::value 返回不同的值。 个不同。带有= default 的构造函数是constexpr 并具有noexcept 规范。以及其他 cmets 所说的话。 @0x499602D2 隐式定义的默认构造函数不是总是 constexpr;只有constexpr 才能正确声明它。 (IIRC 要求所有成员和基础都具有 constexpr 构造函数。【参考方案2】:

所以,这不使用构造函数,而是使用析构函数。但它确实表明了一点。以下代码将编译,并且不会触发任何静态断言。

这意味着您在一个示例中具有用户定义的析构函数,而在另一个示例中具有 __default 析构函数

#include <type_traits>

class X 
    public:
        ~X() 
;

class Y 
    public:
        ~Y() = default;
;

static_assert(std::is_trivially_move_constructible<X>::value == false, "");
static_assert(std::is_trivially_move_constructible<Y>::value == true, "");

【讨论】:

@Nawaz:是的。析构函数。我不知道std::is_trivial,但我认为有一个针对存在的琐碎移动构造函数的测试,这应该只发生在Y。它只是证明了一个语义点,即= default 在一般情况下并不意味着 除非你的意思是答案的粗体部分,我的意思是写析构函数而不是构造函数。

以上是关于=default 和没有参数的空构造函数之间的区别? [复制]的主要内容,如果未能解决你的问题,请参考以下文章

错误: - 服务类没有零参数构造函数

有没有办法覆盖 LINQtoSQL 生成的类中的空构造函数?

C++17 中的显式默认构造函数

Java构造函数

Java继承-子类不可以继承父类的构造方法

普通 ctor(或 dtor)和用户定义的空 ctor(或 dtor)有啥区别