Есть ли способ заставить компилятор потерпеть неудачу, если constexpr, если ветвь не должна ударить?
этот код ниже объясняет все это лучше, чем я мог:
template<unsigned int number_base>
class arithmetic_type
{
if constexpr(number_base == 0 || number_base == 1)
{
//hey, compiler! fail this compilation please
}
else
{
//go on with class implementation
}
}
Ты хочешь static_assert()
. В этом случае вы можете сбросить if constexpr
и просто утверждаю прямо:
template<unsigned int number_base>
class arithmetic_type
{
static_assert(number_base != 0 && number_base != 1); // or >= 2, since unsigned
//go on with class implementation
};
Но, как правило, могут быть места, где вам просто нужно static_assert(false)
, Но это плохо сформировано, это утверждение всегда срабатывает, потому что оно не зависит от условий. В этом случае вам нужно предоставить что-то, что выглядит зависимым, но на самом деле это не так:
// always false, but could hypothetically be specialized to be true, but
// nobody should ever do this
template <class T> struct always_false : std::false_type { };
static_assert(always_false<SomeDependentType>::value);
Других решений пока нет …