Чтобы понять, как 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
используется.
Других решений пока нет …