=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 和没有参数的空构造函数之间的区别? [复制]的主要内容,如果未能解决你的问题,请参考以下文章