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

标签 c++ gcc constants switch-statement

我有以下一些静态常量成员的声明

.h

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

.cpp

const unsigned char MyClass::sInvalid = 0;
const unsigned char MyClass::sOutside = 1;
const unsigned char MyClass::sInside = 2;
//and so on

有时我想在开关中使用这些值,例如:

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

但我收到以下编译器错误:错误:'MyClass::sInvalid' cannot appear in a constant-expression

我已经阅读了其他 switch-cannot-appear-constant-stuff 但没有找到适合我的答案,因为我不明白为什么那些 static const unsigned char 不是常量表达式。

我使用的是 gcc 4.5。

最佳答案

你看到的问题是因为这个

static const unsigned char sInvalid;

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

class MyClass : public MyBase
{
public:
    static const unsigned char sInvalid = 0;
    ...

它会起作用。

关于c++ - 为什么静态常量成员不能出现在像 'switch'这样的常量表达式中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39287468/

相关文章:

c++ - 关闭回显后如何再次回显输入字符?

c++ - Solaris 中的 SH_DENY* 等价物

gcc - 支持 RDTSCP 的 gcc cpu 类型是什么?

c - 在函数原型(prototype)中的 char * param 中添加/*const*/而不是 const 限定符

函数声明中的 C++ const 变量

c++ - 密集和稀疏矩阵的高效(时间和空间复杂度)数据结构

android - 我如何通过 Objective-C 在 Android 上使用 Realm 数据库?

c++ - AVX2:有没有办法实现 _mm256_mul_epi8 函数的 2 的恒定幂?

linux - 创建静态库时嵌入所有外部引用

c - 为什么以下代码在使用 gcc 和 g++ 编译时会给出不同的结果?