Чтобы понять, как Qt предотвращает неполный тип, я просмотрел заголовочный файл qscopedpointer.h. Связанная часть выглядит следующим образом:
template <typename T>
struct QScopedPointerDeleter
{
static inline void cleanup(T *pointer)
{
// Enforce a complete type.
// If you get a compile error here, read the section on forward declared
// classes in the QScopedPointer documentation.
typedef char IsIncompleteType[ sizeof(T) ? 1 : -1 ];
(void) sizeof(IsIncompleteType);
delete pointer;
}
};
Я знаю, что при использовании sizeof с неполным типом компиляция не удастся, но что делают массив и второй sizeof? Разве одного sizeof недостаточно?





Используется массив, поэтому его отрицательный размер приведет к ошибке времени компиляции. Вторая строка гарантирует, что компилятор не может пропустить оценку sizeof(T), гарантируя, что используется фактический размер IsIncompleteType.
Я не уверен, что это выражение sizeof имеет какое-либо значение для компилятора. msvc дает ошибка C2027: использование неопределенного типа T * и * ошибка C2118: отрицательный индекс
спасибо, означает ли это, что некоторые компиляторы оценивают неполный тип как нулевой размер?