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