为什么静态const成员不能出现在像'switch'这样的常量表达式中

vri*_*nce 13 c++ gcc const switch-statement

我有一些静态const成员的声明

.H

class MyClass : public MyBase
{
public:
    static const unsigned char sInvalid;
    static const unsigned char sOutside;
    static const unsigned char sInside;
    //(41 more ...)
}
Run Code Online (Sandbox Code Playgroud)

的.cpp

const unsigned char MyClass::sInvalid = 0;
const unsigned char MyClass::sOutside = 1;
const unsigned char MyClass::sInside = 2;
//and so on
Run Code Online (Sandbox Code Playgroud)

在某些时候,我想在交换机中使用这些值,如:

unsigned char value;
...
switch(value) {
    case MyClass::sInvalid : /*Do some ;*/ break;
    case MyClass::sOutside : /*Do some ;*/ break;
    ...
}
Run Code Online (Sandbox Code Playgroud)

但是我得到以下编译器错误:错误:'MyClass :: sInvalid'不能出现在常量表达式中.

我已经阅读了其他开关 - 不能出现常量的东西,并没有找到我的答案,因为我不明白为什么那些static const unsigned char不是常量表达.

我正在使用gcc 4.5.

jpa*_*cek 18

你看到的问题是由于这个事实

static const unsigned char sInvalid;
Run Code Online (Sandbox Code Playgroud)

不能是编译时常量表达式,因为编译器不知道它的值.像这样在标题中初始化它们:

class MyClass : public MyBase
{
public:
    static const unsigned char sInvalid = 0;
    ...
Run Code Online (Sandbox Code Playgroud)

它会起作用.

  • +1是一个有效的解决方案,但我仍然是一个enum在这里更好. (4认同)

Luc*_*ore 9

值确实是const,但它们不是编译时常量.

一个switch条件在编译时得到解决,而不是运行时.您可以初始化sInvalid为任何值,只要它只有一次,并且switch直到运行时才会知道它.

看起来你更喜欢使用enums而不是static常量.除了它可以工作的事实,它似乎更适合设计.