0

如果不应该命中 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
    }

}
4

1 回答 1

3

你想要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);
于 2017-09-04T15:57:04.997 回答