为什么枚举声明要标记为const?

23

我在我的项目中看到了这个结构:

const enum SomeEnum
{
    val0,
    val1,
    val2
};

这里使用 const 的目的是什么?


我相信这是无效的C++代码,但Visual Studio却能够接受它(GCC不行)。此外,Visual Studio还允许const class A { /* ... */ }; - Cassio Neri
相关 MSVC bug: MSVC const 枚举类型 - Cody Gray
2个回答

20

完全没有。实际上,根据G++的说法,这是一个编译器错误:

error: qualifiers can only be specified for objects and functions

然而,在C语言中是允许的,但是没有用处。GCC表示:

warning: useless type qualifier in empty declaration

问题在于const仅适用于对象(变量)和成员函数,而不适用于基本类型。

15

这并不会影响您的代码,但在这种情况下会产生影响:

const enum SomeEnum
{
    val0,
    val1,
    val2
} VAL0 = val0;

在这里,VAL0 将是一个 const 变量(值为 val0)。但说实话,它没有太多用处。


7
我认为这是有区别的:“它不应该编译”。 - Nawaz
@Nawaz 我看到它没编译通过,但那可能只是编译器的问题。规则里有什么反对它的吗?我见过编译器既接受又拒绝 static struct X {}; 的情况。 - Luchian Grigore
1
我想应该和 const int; 或类似的东西一样。 - chris
在C++中,表达式可以是constvolatile,而不是类型。就像@chris所说的那样,这就像写const int; - Nawaz
@Nawaz 我同意这没有意义,我的意思是我不认为这是直接解决的(据我所知),所以可能要由编译器来处理。 - Luchian Grigore
在VC++ 2012中,我能够执行++VAL0; 我不明白他的const是如何进行++的。有人可以帮助我理解吗? - mahendiran.b

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接