остановка компиляции Visual Studio 17, когда я нажму плохой constexpr, если ветка

Есть ли способ заставить компилятор потерпеть неудачу, если 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
}

}

0

Решение

Ты хочешь 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);
3

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

Других решений пока нет …

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