案例表达不是恒定的

Sir*_*lot 16 c++

我在switch语句中得到一个'case expression not constant'错误.但是,标头为使用的常量提供了定义,构造函数在其初始化列表中为它们提供了初始化.

另外,当我将鼠标悬停在"问题"语句上时,它会将它们标识为常量.

const int ThisClass::EXAMPLE_CONSTANT

error expression must have a constant value
Run Code Online (Sandbox Code Playgroud)

这对我来说似乎有点违反直觉.我做了一些研究,发现了其他人的类似问题.他们被告知所有常量实际上必须在'main'中初始化,并且这是语言的限制.这是真的吗?似乎不太可能.

Naw*_*waz 17

这些case语句需要在编译时必须知道的整数值,这就是常量.但是在这个意义上const,一个阶级的成员并不是真正的常数.它们只是只读的.

您可以使用enum以下内容代替字段:

class ThisClass
{
    public:

        enum Constants
        {
            EXAMPLE_CONSTANT = 10,
            ANOTHER_CONSTANT = 20
        };    
};
Run Code Online (Sandbox Code Playgroud)

然后你可以写,

switch(c)
{
      case ThisClass::EXAMPLE_CONSTANT:
                   //code
                   break;
      case ThisClass::ANOTHER_CONSTANT:
                   //code
                   break;
};
Run Code Online (Sandbox Code Playgroud)

  • 如果常量不相关,我建议使用一个未命名的枚举. (2认同)

Seb*_*ach 5

您需要一个“真正的”编译时整数常量。const在 C++ 中意味着只读,并且可以像 一样初始化 const 变量int y = 0; const int x = y;,从而x生成初始化时的值的只读副本y

使用现代编译器,您可以使用enums 或constexprs 来存储 compile-time-constness 的(整数)成员:

class Foo {
public:
    static constexpr int x = 0;
    enum { y = 1 };
};

int main () {
    switch (0) {
    case Foo::x: ;
    case Foo::y: ;
    }
}
Run Code Online (Sandbox Code Playgroud)