在C ++标准中,它表示删除复制构造函数时不生成默认构造函数?

时间:2014-10-06 17:52:30

标签: c++ c++11 constructor language-lawyer

C ++ 11程序

struct Foo {
    Foo(Foo const &) = delete;
};

int main() {
    Foo foo;
}

生成错误

$ g++ -std=c++11 junk.cpp -o junk
junk.cpp: In function 'int main()':
junk.cpp:6:9: error: no matching function for call to 'Foo::Foo()'
junk.cpp:6:9: note: candidate is:
junk.cpp:2:5: note: Foo::Foo(const Foo&) <deleted>
junk.cpp:2:5: note:   candidate expects 1 argument, 0 provided

现在,由于复制构造函数已被删除,因此无法生成默认构造函数。我将假设这是预期的行为,但在C ++标准中它指定在删除复制构造函数时不应生成默认构造函数?

1 个答案:

答案 0 :(得分:10)

来自N3485§12.1[class.ctor] / 5:

  

如果类X没有用户声明的构造函数,则没有参数的构造函数被隐式声明为默认值(8.4)。

Foo(Foo const &) = delete;是用户声明的构造函数,因此编译器不会生成默认构造函数。