显式删除默认构造函数的目的
Purpose of explicitly deleting the default constructor
我正在处理的代码库主要是在 C++11 之前开发的。许多 类 在私有部分中声明了一个从未定义的默认构造函数。我相当有信心,在现代 C++ 中,正确的方法™ 是使它们 public 和 = delete
。到目前为止,我已无数次“升级”类 到此版本,而且从未出现问题。
我的问题是:为什么要这样做? This answer 表示只有在用户没有提供构造函数的情况下才会提供默认构造函数(我猜这不包括 = default
)并且没有暗示它不适用于 C++ 之前的版本11.当然,在我所说的所有 类 中都有一个非平凡的构造函数。那么,有没有我想念的理由?
任何函数都可以是= delete
d。默认构造函数是一个函数,因此可以将其删除。没有必要为此进行语言分割。
有些用户选择显式删除默认构造函数(或没有定义的私有声明的 pre-C++ pseudo-equivalent),而编译器不会生成它是无害的.的确,它有一些小好处。
如果有人更改 class 以删除其构造函数,class 不会突然获得默认构造函数。
您不必记住生成默认构造函数时的规则。例如:
I guess that’s not including = default
这证明了我的观点,因为你猜错了。显式 default
ed 构造函数确实算作“user-provided”,因此它们确实抑制了隐式默认构造函数的创建。必须记住这一点很麻烦;直截了当地说出来更清楚。
正如在问题下的评论中所明确的那样,声明了构造函数(或成员函数)但从未实现是糟糕的设计,会导致错误消息。 = delete
无论如何都不会生成的东西的唯一正当理由是记录明确的意图。在我的例子中,类 的 none 给人的印象是它应该有一个默认的构造函数。
我仍然不确定在我的情况下什么是理想的,因为这取决于将来谁将在代码库上工作。现在,我将继续将 private never-defiend 更改为 = delete
,但就此保留。与删除后恢复它们相比,找到 = delete
个构造函数并用任何东西替换它们相当容易。
我正在处理的代码库主要是在 C++11 之前开发的。许多 类 在私有部分中声明了一个从未定义的默认构造函数。我相当有信心,在现代 C++ 中,正确的方法™ 是使它们 public 和 = delete
。到目前为止,我已无数次“升级”类 到此版本,而且从未出现问题。
我的问题是:为什么要这样做? This answer 表示只有在用户没有提供构造函数的情况下才会提供默认构造函数(我猜这不包括 = default
)并且没有暗示它不适用于 C++ 之前的版本11.当然,在我所说的所有 类 中都有一个非平凡的构造函数。那么,有没有我想念的理由?
任何函数都可以是= delete
d。默认构造函数是一个函数,因此可以将其删除。没有必要为此进行语言分割。
有些用户选择显式删除默认构造函数(或没有定义的私有声明的 pre-C++ pseudo-equivalent),而编译器不会生成它是无害的.的确,它有一些小好处。
如果有人更改 class 以删除其构造函数,class 不会突然获得默认构造函数。
您不必记住生成默认构造函数时的规则。例如:
I guess that’s not including
= default
这证明了我的观点,因为你猜错了。显式
default
ed 构造函数确实算作“user-provided”,因此它们确实抑制了隐式默认构造函数的创建。必须记住这一点很麻烦;直截了当地说出来更清楚。
正如在问题下的评论中所明确的那样,声明了构造函数(或成员函数)但从未实现是糟糕的设计,会导致错误消息。 = delete
无论如何都不会生成的东西的唯一正当理由是记录明确的意图。在我的例子中,类 的 none 给人的印象是它应该有一个默认的构造函数。
我仍然不确定在我的情况下什么是理想的,因为这取决于将来谁将在代码库上工作。现在,我将继续将 private never-defiend 更改为 = delete
,但就此保留。与删除后恢复它们相比,找到 = delete
个构造函数并用任何东西替换它们相当容易。