【发布时间】:2014-01-16 14:33:27
【问题描述】:
=default 和不带参数的空构造函数之间的区别?
有没有区别:
MyClass() {}
MyClass() = default;
【问题讨论】:
-
我相信第一个构造函数是不平凡的,而第二个是微不足道的。
=default 和不带参数的空构造函数之间的区别?
有没有区别:
MyClass() {}
MyClass() = default;
【问题讨论】:
【讨论】:
std::is_trivial<T>::value 返回不同的值。
= default 的构造函数是constexpr 并具有noexcept 规范。以及其他 cmets 所说的话。
constexpr;只有constexpr 才能正确声明它。 (IIRC 要求所有成员和基础都具有 constexpr 构造函数。
所以,这不使用构造函数,而是使用析构函数。但它确实表明了一点。以下代码将编译,并且不会触发任何静态断言。
这意味着您在一个示例中具有用户定义的析构函数,而在另一个示例中具有 __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, "");
【讨论】:
std::is_trivial,但我认为有一个针对存在的琐碎移动构造函数的测试,这应该只发生在Y。它只是证明了一个语义点,即= default 在一般情况下并不意味着{}。