我可以在case语句中使用数组吗?

Ale*_*lex 3 c++ arrays case switch-statement

我想在C++的switch/case语句中使用const int数组.可能吗?到目前为止,我尝试过类似的东西:

int main()
{
    int const tab[3] = {1,2,3};
    int value(2);
    switch(value)
    {
        case tab[1]:
            cout << "result is: " << tab[0]<< endl;
    }
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

然而,编译器一直告诉我:

.../main.cpp|11|error: the value of ‘tab’ is not usable in a constant expression
Run Code Online (Sandbox Code Playgroud)

我把我的数组声明为"int const",这还不够吗?

Bar*_*rry 6

每个case语句都必须采用常量表达式,定义如下:

条件表达式 Ë是一个核心常量表达式除非的评价Ë,以下抽象机(1.9),将评估下面的表达式中的一个的规则:

  • [...]
  • 除非适用,否则左值到右值的转换(4.1)
    • 整数或枚举类型的非易失性glvalue,它引用具有前面初始化的非易失性const对象,用常量表达式初始化[注意:字符串文字(2.14.5)对应于此类对象的数组.- 注意],或
    • 非易失性glvalue,指向由此类对象定义的非易失性对象constexpr,或引用此类对象的非可变子对象,或者
    • 文字类型的非易失性glvalue,指的是一个非易失性对象,其生命周期始于e的评估范围内;
  • [...]

您的情况是左值到右值的转换,但这三个要点都不适用,因此tab[1]不是核心常量表达式.然而,第二个子项目点为我们提供了一个线索:如果对象被定义了怎么办constexpr!这会产生tab[1]一个常量表达式,因此,这会编译:

constexpr int tab[3] = {1,2,3};
int value(2);
switch(value)
{
    case tab[1]:
        cout << "result is: " << tab[0]<< endl;
}
Run Code Online (Sandbox Code Playgroud)

const不会使对象成为常量表达式.它只是使它不可变.请注意,以下是完全有效的代码:

int x;
cin >> x;
const int y = x; // obviously, y can't be a constant expression
Run Code Online (Sandbox Code Playgroud)