如果constexpr(false)总是计算为true

时间:2019-04-30 13:33:12

标签: c++

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失败“空”

1 个答案:

答案 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始终会触发,即使分支会被丢弃。