构造函数与X() = delete;和private X();

Difference in constructors with X() = delete; and private X();

本文关键字:private delete 构造函数      更新时间:2023-10-16

假设我们有一个类X,我们想要明确禁止,比如标准构造函数。我在头文件中使用了很长时间:

private:
    X(); // 1.

所以,构造函数在类之外被禁用,所以对于任何人。但最近我了解到,在c++ 11中,建议如下:

X() = delete; // 2.

两者都能实现我禁止标准构造函数的愿望。

但是它们之间的确切区别是什么呢?为什么c++ 11会推荐最后一个呢?是否还有其他标志、信号设置在2。路吗?

例1是在c++ 11中出现= delete之前的方法。现在我们有了= delete,这将完全摆脱构造函数。通过将构造函数设置为私有,您仍然可以在成员函数中使用该构造函数,如果您尝试在= delete的成员函数中默认对象,则会导致编译器错误。

#include <iostream>
class Foo
{
    Foo();
public:
    static void SomeFunc() { Foo f; }
};
class Bar
{
public:
    Bar() = delete;
    static void SomeFunc() { Bar b; }
};
int main()
{
    Foo::SomeFunc();  // will compile
    Bar::SomeFunc();  // compiler error
}

生活例子

前者是一种hack。友类可以仍然调用构造函数(并且在链接时您会得到一个错误,除非您实际上也定义了)。

后者实际上阻止了它的自动生成,所以实际上不在那里。