使用点访问匿名枚举值

时间:2014-01-02 23:23:31

标签: c++

此代码与GCC和Clang编译(并且似乎有效):

#include <iostream>

struct Foo {
    enum { number = 42 };
};

int main()
{
    Foo bar;
    std::cout << bar.number << std::endl;
}

See it here.

令我惊讶的是,编译器接受bar.number;我能找到的所有教科书都教导我们使用Foo::number来访问枚举值。

这段代码有效吗?请注意,GCC给出了一个奇怪的警告(“变量'栏'设置但未使用'),而Clang没有抱怨它。

2 个答案:

答案 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有规格引用。他/她/疯狂的图灵机赢了。