Существуют различные способы реализации статического утверждения для случаев, когда компилятор C++ не имеет встроенного static_assert
. Это один пример из Windows SDK (другой известный — из Boost):
#define C_ASSERT(e) typedef char __C_ASSERT__[(e)?1:-1]
Чего я никогда не видел, так это такой строки:
C_ASSERT(true);
сразу после реализации статического утверждения.
Разве не разумно сразу проверить, что хотя бы ваш статический assert не утверждает там, где не должен?
Почему бы сразу не проверить, не утверждает ли это?
sizeof(int) <= 4
, обязательно заявите об этом статически. Однако, если вы реализуете арифметику времени компиляции, вы не должны не включать тесты правильности в заголовки. Включите предварительные проверки, а не доказательства правильности. - person Angew is no longer proud of SO   schedule 07.11.2014sizeof(int)
не находится под контролем автора библиотеки кеша, это зависит от настроек клиента. - person Angew is no longer proud of SO   schedule 07.11.2014std::remove_reference
в стандартном заголовке следует несколько тестовых случаев:static_assert(std::is_same<int, typename std::remove_reference<int&>::type>::value)
, всего несколько случаев, по одному для каждой комбинации cv-ref/not ref/pointer, массивы (они могут распадаться)? Какint
бытьstd::remove_reference<int&>::type
не является обязательным условием дляremove_reference
? - person David Rodríguez - dribeas   schedule 07.11.2014