2011-07-23 11 views
20

だから私はいくつかのブーストソースコードを見ていると、この出くわした:なぜboost :: checked_deleteは "意図的に複雑"ですか?

<boost/checked_delete.hpp>から)

template<class T> inline void checked_delete(T * x) 
{ 
    // intentionally complex - simplification causes regressions 
    typedef char type_must_be_complete[ sizeof(T)? 1: -1 ]; 
    (void) sizeof(type_must_be_complete); 
    delete x; 
} 

誰もがそれはこのように実装されている理由を知ることが起こりますか? sizeof(T)(例えば)はすでに十分ではないでしょうか?

+0

良い質問:) –

答えて

20

Someone asked the same question earlier。ピーターDimov氏(boost/checked_delete.hppone of the writers)によって書かれたこの記事はかなり自身のために語っています:

  • 不完全な型にはsizeofを適用した結果は何ですか?

コンパイル時エラー、コンパイラは 非標準拡張として0を返すことを選択しない限り。

  • なぜsizeofが2回呼び出されたのですか?

第二のsizeofを使用しない限り、最初のtypeofがインスタンス化されることはありません でMetrowerks社のCodeWarriorバグの回避策です。

  • なぜsizeofの結果がvoidになるのですか?正確には何ですか 行 はどうしますか?

コンパイラの警告を消音します。

+0

Doh!私の精神力を1分で打ちなさい!まだ私の推測がかなり正確であることを知ってうれしいです:-) – Praetorian

+0

@Praetorian:私は 'sizeof(T)について同じ疑いがありましたか? 1:-1'という表現を使っていましたが、私はそれを著者自身から直接得たいと思っていました。 :-) –

+2

非常に良い、よくやった。 –

3

これは単なる推測です。 sizeof(incomplete_type)と書いて0と書いたときに警告を出してくれるコンパイラがあるかもしれません。その場合、サイズ-1の配列を宣言しようとすると配列の宣言が失敗することを確認しています。

関連する問題