2010-05-20 53 views
5

工作草案明確地呼籲,默認函數必須是特殊的成員函數(例如複製構造函數,默認構造函數等,(§8.4.2.1-1))。這是非常有意義的。任何函數都可以是刪除函數嗎?

但是,我看不到刪除函數(第8.4.3節)的任何此類限制。是對的嗎?

換句話說這三個例子有效c++0

struct Foo 
{ 
    // 1 
    int bar(int) = delete; 
}; 


// 2 
int baz(int) = delete; 


template< typename T > 
int boo(T t); 

// 3 
template<> 
int boo<int>(int t) = delete; 
+1

什麼是甚至是刪除的功能? – Puppy 2010-05-20 16:06:19

+1

刪除的函數是一個如果它沒有被刪除就會存在的函數。例如。您可以刪除課程副本。這略高於將其私有未實現,這有兩個原因。 1.閱讀代碼時更明顯,2.可以得到更清晰的錯誤信息。 – MSalters 2010-05-21 08:52:03

+2

@ MSalters:您也可以刪除不存在的功能,阻止它們的使用。例如。給出'void f(double); void f(int)= delete;',f(42)現在是一個錯誤,而不是使用隱式轉換。 – 2010-10-12 16:14:23

回答

4

C++ 0x規範(§ [dcl.fct.def.delete])不否認這樣的構造,並且g ++ 4.5可以識別它們的全部3個。

x.cpp: In function 'int main()': 
x.cpp:4:8: error: deleted function 'int Foo::bar(int)' 
x.cpp:21:11: error: used here 
x.cpp:9:5: error: deleted function 'int baz(int)' 
x.cpp:22:2: error: used here 
x.cpp:9:5: error: deleted function 'int baz(int)' 
x.cpp:22:8: error: used here 
x.cpp:17:5: error: deleted function 'int boo(T) [with T = int]' 
x.cpp:23:7: error: used here 
-3

從我從「刪除」的成員函數的定義理解是,它僅適用於可以由編譯器自動創建,而不是普通的成員特殊的成員函數(構造函數,複製,轉讓)功能(這是沒有任何意義的所有國際海事組織,宣佈功能被「刪除」,所以只是不要聲明他們)

+1

它可以用於任何具有默認功能的功能。例如,禁用升級。 – a1ex07 2010-05-20 16:10:31

4

我認爲他們都好。

= delete有利於確保不使用過載(§8.4.3/ 2),這對類以外很有用。

現在5個月後,我看看其他答案...... delete不僅適用於具有隱式定義的函數。這是一個清晰的替代方案,表示「沒有實現 - 使用這是一個鏈接器錯誤。」它提供了一種不實現某些東西的明確方式,例如只有顯式專門化實際存在的基本模板。編譯器會在鏈接時間之前投訴。

對於有點奇怪,但完全合理例如,考慮

class abc { 
protected: 
    inline virtual ~abc() = 0; 
    inline virtual void do_something() = 0; 
}; 

abc::~abc() {} 
void abc::do_something = delete; 

兩個= 0= delete可以在相同的功能使用。如果沒有= delete,用戶可以給abc::do_something()意外打電話。

如果在C++ 0x之後的C++的下一次迭代添加了顯式刪除的類,我不會感到驚訝。

相關問題