【问题标题】:Help ,clarify my doubt on Unqualified Name Lookup :ISO n3290 Draft帮助,澄清我对 Unqualified Name Lookup 的疑问:ISO n3290 Draft
【发布时间】:2011-07-25 09:22:49
【问题描述】:

根据这个链接

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' 被重新声明为不同类型的符号

但是在上面的语句中链接...命名空间范围包含枚举说明符。 ...等

请澄清我的疑问。

否则请任何人给我一个例子来证明上述陈述(在链接中)与命名空间

【问题讨论】:

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


    【解决方案1】:

    不同之处在于原始问题使用struct X 而不是namespace X。命名空间名称在此范围内可见,Foo::X 作为枚举名称“泄漏”到周围的命名空间中也是如此。这会产生冲突。

    在 C 中(因此也在 C++ 中)结构/类/联合的名称位于单独的“标记命名空间”(具有不同含义的 C 术语)中,这允许我们在范围相同:

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

    【讨论】:

    • 但是对于 Struct X 示例,它不会根据上述 ISO 声明产生冲突。但就命名空间而言,它不起作用......我可以知道原因......为什么?请解释一下
    • 我以为我做到了。 :-) 使用结构,您可以通过声明另一个名称来隐藏名称。无论如何,您始终可以通过编写struct X 来获取该结构。这是从 C 继承而来的。命名空间是 C++ 的一项功能,工作方式不同。
    【解决方案2】:

    该程序是非法的。 enum 没有引入单独的范围 (除非您使用 C++11 添加 class 到它),两者 命名空间X 和枚举常量X 在同一个范围内。 只有两种情况可以定义多个相同的名称 一次在同一范围内:重载函数和一个类名。这 类名的特殊情况纯粹是为了 C 兼容性,所以 具有以下功能的 C API:

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

    不会坏。如果同时存在一个类名和另一个名称,则 其他名称优先,除非前面有一个类关键字。

    【讨论】:

    • 注意,在 C++11 中,你不需要enum class 来让枚举器有作用域。它们始终具有枚举名称的范围(假设它们具有枚举名称)。但是,为了向后兼容,它们保留了原来的范围。所以 YFoo::Y 在 C++11 中都是合法的。
    猜你喜欢
    • 2011-03-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-08-17
    • 2020-08-22
    • 1970-01-01
    • 2020-10-15
    • 1970-01-01
    相关资源
    最近更新 更多