我相信[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 identifier([dcl.type.elab]),或者是一个opaque-enum-declaration,声明(或重新声明)其不合格的身份或标识符作为成员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可能是本段改变的原因,我也有一些问题需要理解以下句子(重点是我的):
标准不清楚当一个实体被声明但未在内部命名空间中定义并通过外部命名空间中的using声明声明时会发生什么 ,并且在外部出现具有该名称作为unqualified-id的实体的定义命名空间.这是内部命名空间实体的合法定义,如果定义使用了qualified-id,或者定义是外部命名空间的成员,从而与using-declaration冲突?对这些定义的处理存在实施差异.
此句后面的示例与段落中的示例完全相同[namespace.memdef]/1
.我强调了上面的单词定义,因为X::g()
在所提到的示例中没有对该函数的定义.我错过了什么?