Остановка компиляции 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
    }

}

1 ответ

Решение

Ты хочешь 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);
Другие вопросы по тегам