Почему 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) (например) уже не был бы достаточным?
Ответы
Ответ 1
Кто-то задал тот же вопрос ранее. Это сообщение Питера Димова (одного из авторов boost/checked_delete.hpp
) в значительной степени говорит само за себя:
-
- Каков результат применения sizeof к неполному типу?
Ошибка времени компиляции, если компилятор не хочет возвращать 0 в качестве нестандартное расширение.
-
- Почему sizeof называется дважды?
Второй sizeof является обходным решением для ошибки Metrowerks CodeWarrior в который первый тип никогда не создается, если не используется.
-
- Почему результат sizeof cast недействителен? Что именно линия делать?
Молчает предупреждение компилятора.
Ответ 2
Это просто догадка; но там могут быть компиляторы, которые просто выдают предупреждение, когда вы пишете sizeof(incomplete_type)
и возвращаете 0
. Таким образом, вы убедитесь, что объявление массива не удается в этом случае, пытаясь объявить массив размером -1.