此代码与GCC和Clang编译(并且似乎有效):
#include <iostream>
struct Foo {
enum { number = 42 };
};
int main()
{
Foo bar;
std::cout << bar.number << std::endl;
}
Run Code Online (Sandbox Code Playgroud)
令我惊讶的是,编译器接受了bar.number; 我能找到的所有教科书都可以Foo::number用来访问枚举值.
这段代码有效吗?请注意,GCC给出了一个奇怪的警告("变量'栏'设置但未使用'),而Clang没有抱怨它.
Lig*_*ica 10
这完全有效:
[C++11: 7.2/10]:每个枚举名称和每个未作用域的枚举器都在包含枚举说明符的作用域中声明.每个作用域枚举器都在枚举范围内声明.这些名称遵守为(3.3)和(3.4)中的所有名称定义的范围规则.[..] 在类范围中声明的枚举器可以使用类成员访问运算符(::,.(dot)和->(箭头))来引用,参见5.2.5.
可以在C++ 03标准中的相同位置找到相同的文本(减去作用域枚举的规则).
我不得不承认,这也让我感到惊讶.我原本期望::成为唯一有效的机制.
你在GCC得到警告是不是使用了枚举的,而是你用什么事实,但枚举.在这种情况下,您通常会编写Foo::number并避免实例化Foo实例.