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

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

有没有区别:

MyClass() {}
MyClass() = default;

【问题讨论】:

  • 我相信第一个构造函数是不平凡的,而第二个是微不足道的。

标签: c++ c++11


【解决方案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 在一般情况下并不意味着{}
  • 除非你的意思是答案的粗体部分,我的意思是写析构函数而不是构造函数。
猜你喜欢
  • 2015-06-05
  • 1970-01-01
  • 2015-02-24
  • 2013-09-09
  • 2015-02-23
  • 1970-01-01
  • 2023-03-10
  • 2018-08-27
相关资源
最近更新 更多