универсальное программирование — утверждение времени компиляции в переполнении стека

Я читаю утверждение времени компиляции, после поиска в Интернете я получил код, который я не понял.

template <bool> struct CompileAssert {};
#define COMPILE_ASSERT(expr, msg) \
typedef CompileAssert<(bool(expr))> msg[bool(expr) ? 1 : -1]

Использовал этот COMPILE_ASSERT, как показано ниже.

COMPILE_ASSERT(!sizeof(T*), PassRefPtr_should_never_be_assigned_to)

Но я не получил идею. Может ли кто-нибудь помочь мне в понимании вышеупомянутой части кода.
Второй запутался в этом куске кода

typedef CompileAssert<(bool(expr))> msg[bool(expr) ? 1 : -1]

#Define заменит COMPILE_ASSERT (expr, msg) с вышеупомянутым expession.но как msg [bool (expr)? 1: -1] альтернативный тип для CompileAssert<(BOOL (выражение))>.

Пожалуйста, кто-нибудь объяснит подробно и просто. У меня много много много вопросов.

Например, почему сообщение (PassRefPtr_should_never_be_assigned_to) работает без использования «» для символа *

1

Решение

Если вы передадите выражение макросу, который оценивается как false, макрос даст typedef, как показано ниже:

typedef CompileAssert<false> PassRefPtr_should_never_be_assigned_to[false ? 1 : -1];

который

typedef CompileAssert<false> PassRefPtr_should_never_be_assigned_to[-1];

Таким образом, поскольку отрицательные длины массива недопустимы, компилятор выдаст ошибку для typedef, содержащую «msg» в качестве имени массива.

1

Другие решения

typedef назовет законный или недопустимый фрагмент кода, в зависимости от значения expr,

Скажем bool(expr) является true, В этом случае typedef эквивалентен

typedef CompileAssert<true> msg[1];

Это массив из 1 элемента CompileAssert<true> структуры, названные msg, поскольку CompileAssert<bool> это определенная структура, все хорошо.

Однако если bool(expr) является falsetypedef будет эквивалентен следующему:

typedef CompileAssert<false> msg[-1];

Это, конечно, незаконно (вы не можете создать массив размером -1), поэтому компилятор сообщит об ошибке, которая msg плохо сформирован. И потому что msg параметр макроса, фактически это будет текст, представленный в COMPILE_ASSERTпоэтому сообщение об ошибке для вашего примера может выглядеть примерно так:

Cannot create array PassRefPtr_should_never_be_assigned_to of size -1.

Также обратите внимание, что C ++ 11 имеет встроенный static_assert,

1

По вопросам рекламы [email protected]