我想在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”,这还不够吗?
答案 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
会使常量表达式。