有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]
这个例子有什么意义?
答案 0 :(得分:1)
此示例演示了类范围及其规则,尤其是以下规则
2)S类中使用的名称N应引用同一声明 它的背景以及在S的完整范围内重新评估的情况 违反此规则需要诊断。
在此示例名称中,我没有在类范围中引用相同的名称。首先它引用全局枚举器i然后重新评估并引用类枚举器i。
因此,编译器会发出错误,因为规则中写入了实现定义是否存在编译器诊断。
对于在函数f中的operator sizeof中使用名称c,它是指具有相同名称的类数据成员,因为根据规则
1)类中声明的名称的潜在范围不仅包括在内 名称的声明点后的声明区域, 而且所有功能体