在description on cppreference中,我假设if constexpr
的行为类似于普通的if
,但在编译时有效。
说明说:
在constexpr if语句中,condition的值必须是上下文转换为bool类型的常量表达式。如果该值为true,则丢弃statement-false(如果存在),否则,丢弃statement-true。
constexpr (false)
显然是错误的,因此应该丢弃static_assert,对吗?但是,使用以下代码,我总会得到断言的编译错误:
if constexpr (false) {
static_assert(false, "empty");
}
同时我没有编译错误。这是启用了clang和C ++ 17的XCode 10。这是编译器的问题,还是我误解了这个概念?
通过请求(即使我认为与此处无关):我得到的编译器错误是:
Static_assert失败“空”
答案 0 :(得分:4)
简短的回答:static_assert(false)
永远不要出现在 constexpr if 表达式中,无论它是在模板函数中还是在废弃的分支中。
在您链接的同一页面上:
注意:对于每种可能的专业化,废弃的语句都不会格式错误:
template <typename T> void f() { if constexpr (std::is_arithmetic_v<T>) // ... else static_assert(false, "Must be arithmetic"); // ill-formed: invalid for every T }
static_assert(false, ...)
对于每种可能的专业化都是编译失败,因此static_assert
始终会触发,即使分支会被丢弃。