微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

在什么情况下 C++11 = 默认构造函数与不带参数和空体的构造函数不同?

如何解决在什么情况下 C++11 = 默认构造函数与不带参数和空体的构造函数不同?

我知道如果提供了参数化构造函数,则不会生成隐式认构造函数

如果我们有一个不带参数的构造函数一个空的主体,它可以扮演认构造函数的角色。

class Box {
public:
  Box(int value) : x(value) {}  // parametrized constructor
  Box() {}  // default constructor
private:
  int x;
};

在 C++11 中,我们可以编写 = default 来指定我们希望隐式生成认构造函数存在,即使我们已经有一个参数化的构造函数

class Box {
public:
  Box(int value) : x(value) {}  // parametrized constructor
  Box() = default;
private:
  int x;
};

我想知道,这两种显式指定认构造函数的语法有区别吗?它们是等价的还是不等价的?不带参数和主体的构造函数真的是认构造函数还是其他什么?

我想问一下,会不会存在不带参数和不带体的构造函数的行为与C++11 = default 构造函数不同的情况?欢迎使用晦涩难懂的例子。

解决方法

一个区别是,如果您使用 =default 默认构造函数,则该类型将变为文字类型,这使得该类型的对象能够用作 constexpr 变量。

class Box {
  // ...
  Box() = default;
};

constexpr Box box{};  // ok
class Box {
  // ...
  Box() {}
};

constexpr Box box{};  // error

这是一个 demo

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。