我相信[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()
,因为在提到的示例中没有函数的定义。我错过了什么?