为什么C++11会隐式删除我的默认构造函数?

3

我希望使用C++11使我的类不可复制,在私有继承boost::noncopyable之前。在C++11中,我实现了以下内容:

class Foo
{
public:
    Foo(const Foo&) = delete;
    Foo& operator=(const Foo&) = delete;
};

随着这个变化,使用VS 2013编译客户端代码时会出现以下错误:

..\main.cpp(9): error C2512: 'Foo' : no appropriate default constructor available

我的客户端代码非常简单:

int main()
{
    Foo foo;
}

在我的情况下,有没有任何C++11规则会隐式删除默认构造函数?

g++-4.9 也是这样说的。不管怎样,修复起来很简单:Foo() = default; - undefined
@stefan 但是在我的情况下,C++11规则中删除了默认构造函数是什么? - undefined
2个回答

11
Foo的默认构造函数并没有被删除,它只是未定义。显式缺省/删除的构造函数是用户声明的构造函数,这会阻止隐式声明默认构造函数。Foo有一个用户声明的构造函数,即显式删除的复制构造函数。
来自N3337,§12.1/5 [class.ctor]
注意,如果默认构造函数确实被删除,错误消息可能会明确说明。例如,如果我将Foo的定义更改为
class Foo
{
public:
    int &i;
};
数据成员的引用类型隐含删除了默认构造函数。现在,clang和gcc输出错误消息

error: call to implicitly-deleted default constructor of 'Foo'

以及

error: use of deleted function 'Foo::Foo()'

将这些与您的原始示例产生的错误消息进行比较:

error: no matching constructor for initialization of 'Foo'
error: no matching function for call to 'Foo::Foo()'


要修复您的示例,您需要显式地默认默认构造函数。

Foo() = default;

6
隐式默认构造函数并没有被删除,只是当你有其他构造函数时,它就不会被生成。这个情况从很久以前就一直存在。
根据C++03 [class.ctor]/5:
类X的默认构造函数是一个可以在没有参数的情况下调用的X类的构造函数。如果对于类X没有用户声明的构造函数,那么默认构造函数就会被隐式地声明。
根据C++11 [class.ctor]/5 (在C++14中也是一样的):
类X的默认构造函数是一个可以在没有参数的情况下调用的X类的构造函数。如果对于类X没有用户声明的构造函数,则会隐式声明一个没有参数的构造函数。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接