帮助,澄清我对不合格名称查询的疑问:ISO n3290草案

时间:2011-07-25 09:22:49

标签: c++ enums namespaces c++11 scope

根据此链接

A point from C++0x draft : n3290

这个程序是否正确?

EX:
namespace  X {};
enum Foo
  {
      X = 0,     #1
      Y,
      Z = X // X refers to the enum, not the type
  };

执行此程序时遇到错误,如//#1'X'重新声明为不同类型的符号

但是在上面的语句链接中...包含enum-specifier的命名空间范围。 ......等等。

请澄清我的疑问。

否则请任何人给我一个例子,用命名空间

证明上述陈述(在链接中)

2 个答案:

答案 0 :(得分:1)

原始问题有一个struct X而不是namespace X。命名空间名称在此范围内是可见的,因此枚举名称“泄漏”到周围的命名空间中也是如此。这造成了冲突。

在C中(因此也在C ++中)struct / class / union的名称位于单独的“tag namespace”(具有不同含义的C术语)中,这允许我们使用相同的名称声明另一个项目。相同的范围:

Difference between 'struct' and 'typedef struct' in C++?

答案 1 :(得分:0)

该计划是非法的。 enum不会引入单独的范围 (除非你使用C ++ 11 添加class),两者都是 名称空间X和枚举常量X属于同一范围。 只有两种情况可以定义相同的名称 曾经在同一范围内:重载函数和一个类名。该 类名的特殊情况纯粹是为了C兼容性,所以 C API具有以下功能:

struct stat { ... };
int stat(const char* path, struct stat* buf);

不会破裂。如果同时存在类名和其他名称,则 其他名称具有优先权,除非前面有类关键字。