2015-01-04 19 views
20

私は自動変数としてそれを使用してから、私のクラスのユーザーを防ぎたいので、私はこのようなコードを書く:私はコードがコンパイルされないことを期待するが、G ++がエラーなしでそれをコンパイル"= default"デストラクタと空のデストラクタの違いは何ですか?

class A { 
private: 
    ~A() = default; 
}; 

int main() { 
    A a; 
} 

を。私は、コードを変更するとき

しかし、:今すぐ

class A { 
private: 
    ~A(){} 
}; 

int main() { 
    A a; 
} 

、G ++は、私の予想であるとして~A()は、プライベートであることエラーが発生します。

"= default"デストラクタと空のデストラクタの違いは何ですか?

+4

gccのどのバージョンですか? –

+1

[このデストラクタのリファレンス](http://en.cppreference.com/w/cpp/language/destructor)の違いは、ユーザが提供するデストラクタ(空であっても)が*自明ではないということです。参照:「些細なデストラクタを持つオブジェクトは、削除式を必要とせず、単純に記憶域の割り当てを解除するだけで処分できます。 –

+8

あなたの場合、最初の例では違いはありません。[gcc4.9とclang3.5はコンパイルを拒否します](http://coliru.stacked-crooked.com/a/41976bc03bc12c79)。あなたのgccのバグでなければなりません。 – Praetorian

答えて

23

最初の例はコンパイルしないでください。これは、コンパイル時にコンパイルするバグを表します。このバグはgcc 4.9以降で修正されています。

= defaultで定義されたデストラクタはです。この場合はです。これはstd::is_trivially_destructible<A>::valueで検出できます。

更新

C++ 11(およびC++ 14)状態1つはユーザー宣言デストラクタを持っている場合(そして、あなたが持っていないのいずれかのユーザ宣言は特別会員を移動した場合) 、コピーコンストラクタおよびコピー代入演算子の暗黙の生成は引き続き行われますが、その動作は推奨されません。あなたがそれに頼るならば、あなたのコンパイラはあなたに非推奨警告を与えるかもしれません。

両方:

~A() = default; 

と:

~A() {}; 

ユーザー宣言であるので、それらは、この点に関しては差がありません。これらのフォームのいずれかを使用する場合(およびメンバーの移動を宣言しない場合)、非推奨の動作に頼らないために、コピーメンバーを明示的にデフォルト、明示的に削除、または明示的に指定する必要があります。

メンバーを移動する(デストラクタを宣言するかどうかにかかわらず)と宣言した場合、コピーメンバーは暗黙的に削除されます。

+2

@delphifirst:最近、コンパイラのバグは非常に一般的です。私が学生だったとき、1980年代初めに、不愉快な振る舞いがコンパイラではなく私たちのコードのバグであることを確かめました。今日私は定期的にコンパイラをクラッシュさせています(ICE、内部コンパイラエラー)。それでは、誰の欠陥であるのか疑問はありません。 –

+0

@HowardHinnant:私はそれが、 "user declared"というフレーズの標準の使用に関連していると思う。 C++での§12.8/ 18。お願いします? –

+0

@ Cheersandhth.-Alf:喜んで助けますが、私はあなたの質問を理解していません。 '= defaulted'特別メンバーがユーザー宣言されているかどうかを尋ねるなら、答えはyesですが、ユーザーは提供しません。 –

関連する問題