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

Существуют различные способы реализации статического утверждения для случаев, когда компилятор C++ не имеет встроенного static_assert. Это один пример из Windows SDK (другой известный — из Boost):

#define C_ASSERT(e) typedef char __C_ASSERT__[(e)?1:-1]

Чего я никогда не видел, так это такой строки:

C_ASSERT(true);

сразу после реализации статического утверждения.

Разве не разумно сразу проверить, что хотя бы ваш статический assert не утверждает там, где не должен?

Почему бы сразу не проверить, не утверждает ли это?


person sharptooth    schedule 07.11.2014    source источник
comment
Место тестового кода должно быть в модульном тесте, а не в реальном коде.   -  person Jarod42    schedule 07.11.2014
comment
@Jarod42: Я не понимаю, почему. Вы статически утверждаете много вещей в реальном коде, не так ли? Почему бы static не утверждать true и в коде?   -  person sharptooth    schedule 07.11.2014
comment
@sharptooth Почему каждый клиент реализации статической проверки должен быть вынужден платить накладные расходы на компиляцию одного теста (каким бы минимальным он ни был) во время каждой компиляции? У автора static-assert, безусловно, есть тесты для него, но зачем сливать их в клиентский код?   -  person Angew is no longer proud of SO    schedule 07.11.2014
comment
@Angew: Означает ли это, что у меня не должно быть никаких статических утверждений в широко включенных заголовках?   -  person sharptooth    schedule 07.11.2014
comment
@sharptooth Нет, из этого не следует. Вы должны добавить все статические утверждения, которые необходимы вашему коду для правильной работы. Если вы реализуете сверхбыстрый кеш, основанный на sizeof(int) <= 4, обязательно заявите об этом статически. Однако, если вы реализуете арифметику времени компиляции, вы не должны не включать тесты правильности в заголовки. Включите предварительные проверки, а не доказательства правильности.   -  person Angew is no longer proud of SO    schedule 07.11.2014
comment
@Angew: Почему статическое утверждение true не является обязательным условием для использования статического утверждения?   -  person sharptooth    schedule 07.11.2014
comment
@sharptooth Это не обязательное условие, потому что его результат находится под контролем автора static-assert. sizeof(int) не находится под контролем автора библиотеки кеша, это зависит от настроек клиента.   -  person Angew is no longer proud of SO    schedule 07.11.2014
comment
@Angew: Хорошо, кажется, я понимаю разницу. Что еще, кроме накладных расходов на компиляцию, может быть причиной не включать эту проверку?   -  person sharptooth    schedule 07.11.2014
comment
@sharptooth Просто общая чистота, я бы сказал. Если бы я увидел такой тест в реализации статического подтверждения, которую я использовал, я бы сразу подумал, какого черта он там? Это нужно для чего-то?   -  person Angew is no longer proud of SO    schedule 07.11.2014
comment
@Angew: Понятно. Просто для сравнения: я был бы очень рад увидеть, что люди, создававшие библиотеку, дошли до того, что позаботились об этом крошечном кусочке. Может избавить меня от многих проблем при портировании.   -  person sharptooth    schedule 07.11.2014
comment
Хм... так вы также ожидаете, что за std::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
comment
@sharptooth: я обычно проверяю тесты в библиотеке, чтобы определить, было ли это полностью протестировано, а не код.   -  person David Rodríguez - dribeas    schedule 07.11.2014


Ответы (1)


Разумно протестировать и протестировать #including данный файл определения статического подтверждения в некоторый тестовый исходный файл. Точно так же, как мы создаем класс, мы тестируем его с помощью примера программы, статические утверждения хорошо тестируются на разных компиляторах. Возможно, будет система сборки, которая будет компилировать файл типа test_all_asserts.cpp (модульное тестирование) при каждой модификации (скажем, при каждой регистрации).

Вы получаете файл заголовка, имеющий определение статического подтверждения, а не файл test_all_asserts.cpp.

person Ajay    schedule 07.11.2014