stop visual studio 17 compile when I hit a bad constexpr if 分支

stop visual studio 17 compile when i hit a bad constexpr if branch

如果不应该命中 constexpr if 分支,是否有任何方法可以强制编译器失败?

下面的这段代码比我能更好地解释了这一切:

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);