此代码与GCC和Clang编译(并且似乎有效):
#include <iostream>
struct Foo {
enum { number = 42 };
};
int main()
{
Foo bar;
std::cout << bar.number << std::endl;
}
令我惊讶的是,编译器接受bar.number
;我能找到的所有教科书都教导我们使用Foo::number
来访问枚举值。
这段代码有效吗?请注意,GCC给出了一个奇怪的警告(“变量'栏'设置但未使用'),而Clang没有抱怨它。
答案 0 :(得分:10)
完全有效:
[C++11: 7.2/10]:
每个枚举名称和每个未作用域的枚举数都在立即包含枚举说明符 的作用域中声明。每个范围的枚举器都在枚举范围内声明。这些名称遵守为(3.3)和(3.4)中的所有名称定义的范围规则。 [..] 可以使用类成员访问运算符(::
,.
(点)和{{1}来引用类范围中声明的枚举数}(箭头)),见5.2.5。
可以在C ++ 03标准的同一位置找到相同的文本(减去作用域枚举的规则)。
我不得不承认,这也让我感到惊讶。我原以为->
是唯一有效的机制。
你在GCC中得到的警告不是关于enum的使用,而是关于你不使用任何而是枚举的事实。在这种情况下,您通常会编写::
并避免实例化Foo::number
实例。
答案 1 :(得分:0)
在这里猜一下:
由于enum
在技术上是一个类型,因此编译器可以将Foo :: number视为const或static const。如果您:
#include <iostream>
using namespace std;
enum { number = 42 };
int main()
{
std::cout << number << endl;
}
在这种情况下,number
似乎已立即解析,并且在this->
和type.
范围内均有效。
正如我所说,这只是猜测。 @LightnessRacesInOrbit有规格引用。他/她/疯狂的图灵机赢了。