如何在 constexpr if-else 链中导致静态错误?

And*_*zos 2 c++ static-assert constexpr c++20 if-constexpr

在以下 C++20 函数模板中:

template<int i>
void f() {
    if constexpr (i == 1)
       g();
    else if constexpr (i == 2)
       h();
    else
       ??? // <--error
}
Run Code Online (Sandbox Code Playgroud)

有什么我们可以写的东西,???这样f<3>()在编译时调用就会失败?

son*_*yao 6

问题是constexpr if被丢弃的语句对于每个可能的专业化都不能格式错误[temp.res.general]/6

(强调我的)

可以在任何实例化之前检查模板的有效性。

程序格式错误,无需诊断,如果:

  • 不能为模板中的模板或constexpr if语句的子语句生成有效的特化,并且模板未实例化,或

您可以使用始终为 的依赖于类型的表达式false。例如

template<int i> struct dependent_false : std::false_type {};

template<int i>
void f() {
    if constexpr (i == 1)
       g();
    else if constexpr (i == 2)
       h();
    else
       static_assert(dependent_false<i>::value, "Must be 1 or 2");
}
Run Code Online (Sandbox Code Playgroud)