Используйте конструкцию, которую нельзя использовать во время компиляции, например, исключение:
constexpr foo(std::initializer_list<bar> items)
{
for (auto&& i : items) {
if (i == 12) {
throw std::invalid_argument{""}; // for example
}
}
}
или ложное утверждение, если исключение отключено:
constexpr foo(std::initializer_list<bar> items)
{
for (auto&& i : items) {
assert(i != 12);
}
}
, или вызов времени выполнения функция, если определено NDEBUG
:
constexpr foo(std::initializer_list<bar> items)
{
for (auto&& i : items) {
if (i == 12) {
std::cerr << "Error\n";
}
}
}
Диагностика c требуется, если выражения только во время выполнения оцениваются как часть оценки константного выражения.
static_assert
не работает, потому что аргумент к нему должен быть константным выражением, а аргументы constexpr
- нет.