使用 constexpr 变量作为 case 标签

Har*_*rry 1 c++ switch-statement constexpr c++17

使用 constexpr 变量作为 case 标签是否正确?

#include <iostream>

int main() {
    constexpr int x = 5;

    int y = 4;

    switch (y) {
        case x - 1:
            std::cout << "case " << x << std::endl;

            break;

        case 20:
            std::cout << "case 20" << std::endl;

            break;

        default:
            std::cout << "case default" << std::endl;

            break;
    }
}
Run Code Online (Sandbox Code Playgroud)

Nel*_*eal 8

这是。cppreference表示 case 值必须是

转换和整数提升后与条件类型相同类型的常量表达式

这包括像变量constexpr这样的表达式constexpr,您可以像示例中那样减去 1。

在标准中,那就是[stmt.switch]

switch 语句中的任何语句都可以使用一个或多个 case 标签进行标记,如下所示:
case constant-expression :
其中常量表达式应为 switch 条件的调整类型的转换常量表达式。同一开关中的两个 case 常量在转换后不得具有相同的值。

常量表达式是 中的任何内容[expr.const]

例如,您甚至可以使用constexpr函数调用:

constexpr int caseLabel() {
    return 4;
}
// ...
switch (y) {
    case caseLabel():
Run Code Online (Sandbox Code Playgroud)