Подтвердить что ты не робот

Почему boost:: checked_delete "намеренно сложный"?

Итак, я просматривал исходный код boost и наткнулся на это:

(from <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;
}

Кто-нибудь знает, почему это реализовано таким образом? Разве размер (T) (например) уже не был бы достаточным?

4b9b3361

Ответ 1

Кто-то задал тот же вопрос ранее. Это сообщение Питера Димова (одного из авторов boost/checked_delete.hpp) в значительной степени говорит само за себя:

  •   
  • Каков результат применения sizeof к неполному типу?  

Ошибка времени компиляции, если компилятор не хочет возвращать 0 в качестве нестандартное расширение.

  •   
  • Почему sizeof называется дважды?  

Второй sizeof является обходным решением для ошибки Metrowerks CodeWarrior в который первый тип никогда не создается, если не используется.

  •   
  • Почему результат sizeof cast недействителен? Что именно   линия   делать?  

Молчает предупреждение компилятора.

Ответ 2

Это просто догадка; но там могут быть компиляторы, которые просто выдают предупреждение, когда вы пишете sizeof(incomplete_type) и возвращаете 0. Таким образом, вы убедитесь, что объявление массива не удается в этом случае, пытаясь объявить массив размером -1.