Использование sizeof в реализации QScopedPointer

Чтобы понять, как 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 недостаточно?

Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
1
0
129
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

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

спасибо, означает ли это, что некоторые компиляторы оценивают неполный тип как нулевой размер?

Zhilei Han 25.07.2018 08:11

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

Swordfish 25.07.2018 08:59

Другие вопросы по теме