2012-01-24 6 views
4

可能性の重複:
Destructors of builtin types (int, char etc..)このテンプレート関数が正しくコンパイルされるのはなぜですか?

テンプレート関数:

template<typename T> void kill(T* type) 
{ 
    type->~T(); 
} 

コール:

int x= 5; 
kill(&x); 

すごい迫力、それはコンパイルされた! intのようなプリミティブ型はどのようにしてデストラクタを持つことができますか?デストラクタの明示的な呼び出しのための表記法は、(任意のスカラー型 名のために使用することができる。それはまた、標準の等

+0

'destroy'または' kill'ですか? – sblom

+0

を殺す!私は殺人狂人です。 – ApprenticeHacker

+0

OK - 上記の 'destroy'を' kill'に変更しました。 – sblom

答えて

4

§12.4.16bool

16 [注意を言い、charと協力して5.2.4)。これを許可すると、指定された型に対して デストラクタが存在するかどうかを知らずにコードを書くことが可能になります。例えば、

typedef int I; 
I* p; 
p->I::~I(); 

末端音符]

+0

コンパイラはスカラー型のデストラクタへの呼び出しを無視しますか? – ApprenticeHacker

+0

@IntermediateHacker特に無視しても、何もせずにコードから外しても、その効果は同じです。これはおそらく、特にテンプレートを書くのを容易にするための機能です(私は推測することができますが、C++にテンプレートがある前にこの機能があるかどうかはわかりません)。また、btw、あなたのコードは、整数が2回破壊されているため、未定義の動作を示しています:) –

+0

@SethCarnegie:複数の疑似デストラクタ呼び出しのために未定義の動作はありません。唯一の効果は、 '.'または' - > 'の前にある式の評価です。さらに、同じオブジェクトに対して、些細なデストラクタを複数回呼び出すためのUBは存在しないようです。 –

1

規格の関連部分は、§5.2.4/ 1:

擬似デストラクタ名の使用後点 。またはarrow - >演算子は、type-nameで指定された非クラス型のデストラクタを表します。結果は、関数呼び出しoperator()のオペランドとしてのみ使用され、そのような呼び出しの結果はvoid型になります。唯一の効果は、ドットまたは矢印の前にある接尾辞の式の評価です。

関連する問題