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",这还不够吗?
每个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)