课堂内外的无范围枚举重新定义

时间:2014-05-20 03:56:17

标签: c++ class enums

有3.3.7 / 5中的例子:

typedef int c;
enum { i = 1 };
class X 
{
    char v[i]; // error: i refers to ::i
               // but when reevaluated is X::i
    int f() { return sizeof(c); } // OK: X::c
    char c;
    enum { i = 2 };
};

但它甚至没有编译。导致以下错误:

  

test.cpp:9:12:错误:声明'i'[-fpermissive]

     

test.cpp:4:8:错误:从'i'改变'i'的含义[-fpermissive]

这个例子有什么意义?

1 个答案:

答案 0 :(得分:1)

此示例演示了类范围及其规则,尤其是以下规则

  

2)S类中使用的名称N应引用同一声明   它的背景以及在S的完整范围内重新评估的情况   违反此规则需要诊断。

在此示例名称中,我没有在类范围中引用相同的名称。首先它引用全局枚举器i然后重新评估并引用类枚举器i。

因此,编译器会发出错误,因为规则中写入了实现定义是否存在编译器诊断。

对于在函数f中的operator sizeof中使用名称c,它是指具有相同名称的类数据成员,因为根据规则

  

1)类中声明的名称的潜在范围不仅包括在内   名称的声明点后的声明区域,   而且所有功能体