5

我相信[namespace.memdef]/1的新措辞试图解释两个声明using M::g;void g();in namespace之间的冲突X,但我无法理解这个新措辞与所暗示的冲突之间的关系。

命名空间中的声明N(不包括嵌套范围中的声明),其声明符 id是非限定 id ([dcl.meaning]),其类头名称(Clause [class]) 或枚举头名称 ([dcl .enum]) 是一个标识符,或者其详细类型说明符 的形式为class-key attribute-specifier-seq opt identifier ([dcl.type.elab]),或者是一个opaque-enum-declaration,声明(或重新声明)其unqualified-id标识符N. [ 注意:模板的显式实例化 ([temp.explicit]) 或显式特化 ([temp.expl.spec]) 不会引入名称,因此可以使用封闭命名空间成员中的非限定 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时,我在理解以下句子时也存在一些问题(重点是我的):

标准不清楚当一个实体被声明但未在内部命名空间中定义并通过 外部命名空间中的using-declaration 声明时会发生什么,并且具有该名称的实体的定义作为unqualified-id出现在外部命名空间中命名空间。这是内部命名空间实体的合法定义,就像定义使用了限定 ID一样,还是定义是外部命名空间的成员,因此与using-declaration冲突?在处理此类定义方面存在实施分歧。

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

4

0 回答 0