我认为[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()
的定义。我错过了什么?