[namespace.memdef] / 1

时间:2017-01-24 18:01:45

标签: c++ namespaces language-lawyer using-declaration

我认为[namespace.memdef]/1的新措辞试图解释名称空间using M::g;中两个声明void g();X之间的冲突,但我无法理解它们之间的关系这个新的措辞和暗示的冲突。

  

名称空间N中的声明(不包括嵌套的声明)   范围)其 declarator-id unqualified-id ([dcl.meaning]),   其 class-head-name (Clause [class])或 enum-head-name   ([dcl.enum])是标识符,或其详细说明类型说明符   格式为 class-key attribute-specifier-seq opt   标识符([dcl.type.elab]),或者是 opaque-enum-declaration ,声明(或重新声明)其 unqualified-id 标识符作为N的成员。 [注意:显式实例化([temp.explicit])或显式特化   ([temp.expl.spec])模板不会引入名称   可以在封闭的成员中使用 unqualified-id 声明   命名空间集,如果主要模板是在内联中声明的   命名空间。 - 尾注] [例子:

namespace X {
  void f() { /* ... */ }        // OK: introduces X​::​f()

  namespace M {
    void g();                   // OK: introduces X​::​M​::​g()
  }
  using M::g;
  void g();                     // error: conflicts with X​::​M​::​g()
}
     

- 结束示例]

即使我看到DR 1838可能是本段改变的原因,我也有一些问题需要理解以下句子(重点是我的):

  

标准不清楚实体是什么时发生的   声明但未在内部命名空间中定义并通过a声明   外部名称空间中的 using-declaration ,以及名称为 unqualified-id 的实体的定义出现在外部名称中   命名空间。这是内部命名空间的合法定义   实体,如果定义使用 qualified-id ,或者是   定义是外部命名空间的成员,因此存在冲突   使用使用声明?有实施分歧   这种定义的处理。

此句后面的示例与段落[namespace.memdef]/1中的示例完全相同。我在上面突出显示了定义这个词,因为在所提到的示例中没有函数X::g()的定义。我错过了什么?

0 个答案:

没有答案