tom*_*myk 1 c++ default-constructor c++11
在我私下继承我的类之前,我想使用C++ 11使我的类不可复制boost::noncopyable.在C++ 11中,我实现了以下内容:
class Foo
{
public:
Foo(const Foo&) = delete;
Foo& operator=(const Foo&) = delete;
};
Run Code Online (Sandbox Code Playgroud)
通过此更改编译客户端代码(使用VS 2013)会出现以下错误:
..\main.cpp(9): error C2512: 'Foo' : no appropriate default constructor available
Run Code Online (Sandbox Code Playgroud)
我的客户端代码非常简单:
int main()
{
Foo foo;
}
Run Code Online (Sandbox Code Playgroud)
是否有任何C++ 11规则在我的情况下隐式删除默认构造函数?
默认构造函数Foo不会被删除,它根本就没有定义.显式默认/删除的构造函数是用户声明的构造函数,这会导致默认构造函数的隐式声明被禁止.Foo有一个用户声明的构造函数,显式删除的复制构造函数.
来自N3337,§12.1/ 5 [class.ctor]
类的默认构造函数是类
X的构造函数X,可以在没有参数的情况下调用.如果类X没有用户声明的构造函数,则没有参数的构造函数被隐式声明为默认值(8.4)....
请注意,如果确实删除了默认构造函数,则错误消息可能已经说了很多.例如,如果我将Footo 的定义更改为
class Foo
{
public:
int &i;
};
Run Code Online (Sandbox Code Playgroud)
引用类型的数据成员的存在隐式删除默认构造函数.现在,clang和gcc会生成错误消息
错误:调用隐式删除的'Foo'默认构造函数
和
错误:使用已删除的函数'Foo :: Foo()'
将这些与原始示例生成的错误消息进行比较
错误:没有用于初始化'Foo'
错误的匹配构造函数:没有用于调用'Foo :: Foo()'的匹配函数
要修复您的示例,您需要显式默认默认构造函数
Foo() = default;
Run Code Online (Sandbox Code Playgroud)
隐式默认构造函数不会被删除,如果你有其他构造函数,它就不会被生成.从很老的时候开始就是这样.
C++ 03 [class.ctor]/5:
类的默认构造函数是类
X的构造函数X,可以在没有参数的情况下调用.如果类没有用户声明的构造X函数,则隐式声明默认构造函数.
C++ 11 [class.ctor]/5(在C++ 14中相同):
类的默认构造函数是类
X的构造函数X,可以在没有参数的情况下调用.如果类没有用户声明的构造X函数,则不会将没有参数的构造函数隐式声明为默认值