在 C++ 标准中,在哪里定义了对不合格的 *mem-initializer-id* 的查找?

Where in the C++ Standard the lookup for an unqualified *mem-initializer-id* is defined?

这是 §12.6.2/2 (C++14) 中的第一句话:

In a mem-initializer-id an initial unqualified identifier is looked up in the scope of the constructor’s class and, if not found in that scope, it is looked up in the scope containing the constructor’s definition.

想知道在§3.4.1 Unqualified Name Lookup中,上面提到的lookup("in the scope of the constructor's class")是在哪里定义的?如果没有,我在哪里可以找到规范中的这个定义?

我的第一个猜测是 §3.4.1/7 但我认为这不正确,因为构造函数 class 的非静态数据成员在 [=17= 中初始化]mem-initializer-id,似乎不符合本段 4 个要点中的条件。

有点令人失望的答案,我欢迎能证明我错了的答案,但我不认为它在那里。

3.4 开始为(强调我的):

3.4 Name lookup [basic.lookup]

The name lookup rules apply uniformly to all names (including typedef-names (7.1.3), namespace-names (7.3), and class-names (9.1)) wherever the grammar allows such names in the context discussed by a particular rule. [...]

如果 12.6.2 说一个非限定标识符在该上下文中不根据普通非限定名称查找规则查找,如果 12.6.2 说一个非限定标识符在该上下文中得到不同的查找规则,那么它不是3.4 必须明确排除该上下文,因为它已经被隐式排除。

在 3.4.1p11 中有一条注释引用了 12.6.2,但它只涵盖了构造函数初始化列表中使用的表达式,而不是成员。

是3.4.1/8。您可能错过的是 mem-initializer-list 是构造函数函数体的一部分。请参阅 function-body:

的语法产生式

function-body:

  • ctor-initializeropt compound-statement

  • function-try-block

  • = default ;

  • = delete ;

然后从 3.3.7/1 可以看出,这在所有 class 成员的潜在范围内,包括那些定义点在构造函数定义之后的成员。

The potential scope of a name declared in a class consists not only of the declarative region following the name’s point of declaration, but also of all function bodies, default arguments, exception-specifications, and brace-or-equal-initializers of non-static data members in that class (including such things in nested classes).