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

时间:2015-05-30 18:26:20

标签: c++ arrays switch-statement case

我想在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;
}

然而编译器一直告诉我:

.../main.cpp|11|error: the value of ‘tab’ is not usable in a constant expression

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

2 个答案:

答案 0 :(得分:6)

每个case语句必须采用常量表达式,其定义为:

  

条件表达式 e 核心常量表达式,除非按照规则评估 e 的   抽象机器(1.9),将评估以下表达式之一:

     
      
  • [...]
  •   
  • 左值 - 右值转换(4.1),除非适用于   
        
    • 整数或枚举类型的非易失性glvalue,它引用非易失性const对象   前面的初始化,用常量表达式初始化[注意:一个字符串文字(2.14.5)   对应于这样的对象的数组。 -end note]
    •   
    • 非易失性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;
}

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

int x;
cin >> x;
const int y = x; // obviously, y can't be a constant expression

答案 1 :(得分:2)

不,您不需要const,您需要constexpr。用以下代码重写代码:

int main()
{
    constexpr int tab[3] = {1,2,3};
    int value(2);
    switch(value)
    {
        case tab[1]:
            cout << "result is: " << tab[0]<< endl;
    }
    return 0;
}

由于在编译时需要tab的值,因此它应该是constexpr表达式。此外,每个case语句都需要常量表达式 而不是 常量值const会使常量值,而constexpr会使常量表达式