2014-10-06 52 views
4

的C++ 11程序在C++標準中,它是否聲明在複製構造函數被刪除時不會生成默認構造函數?

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++標準中它是否指定在複製構造函數被刪除時不應該生成默認構造函數?

回答

10

從N3485§12.1[class.ctor]/5:

如果對於X類沒有用戶聲明的構造,功能爲缺省不具有參數的構造是隱式聲明(8.4)。

Foo(Foo const &) = delete;是用戶聲明的構造函數,因此編譯器不會生成默認構造函數。