X() = delete; 构造函数的区别和私人 X();

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

让我们假设我们有一个 class X 并且我们希望我们明确禁止,比方说标准构造函数。 Header文件我用了很久:

private:
    X(); // 1.

所以,构造函数在 class 之外被禁用,所以对任何人都是如此。但最近我了解到在 C++11 中推荐了以下内容:

X() = delete; // 2.

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

但它们之间的确切区别是什么?为什么 C++11 会推荐最后一个? 2. way中是否还有其他flags、signals设置?

前者有点骇人听闻。一个朋友 class 可以 仍然 调用构造函数(并且你会在 link 时得到一个错误,除非你实际上 定义 也是如此)。

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

示例 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
}

Live Example