3.4.1/6 是否忽略了在函数的参数声明子句中找到的函数中使用的名称的查找?

Does 3.4.1/6 ignore the lookup of a name used in a function which is found in the function's parameter-declaration-clause?

本文关键字:函数 子句 查找 声明 参数 是否      更新时间:2023-10-16

3.4.1/6:

函数

定义中使用的名称,紧跟在函数的 声明符 ID28,它是命名空间 N 的成员(其中,仅用于公开目的,N可以表示全局 范围)应在在其所在的块中使用之前声明 已使用或在其封闭块之一(6.3)中,或应声明 在命名空间中使用之前N或者,如果N是嵌套命名空间,则应 在N的一个封闭命名空间中使用之前声明。

[ 示例:

namespace A {  
    namespace N {  
        void f();  
    }  
}  
void A::N::f() {  
    i = 5;  
    // The following scopes are searched for a declaration of i:  
    // 1) outermost block scope of A::N::f, before the use of i  
    // 2) scope of namespace N  
    // 3) scope of namespace A  
    // 4) global scope, before the definition of A::N::f  
}

我相信 3.4.1/6 忽略了在函数的参数声明子句中找到的函数体中使用的名称的查找,如下所示:

void f(int i) { std::cout << i << 'n'; }

该段落与您的示例无关,因为在您的示例中,i不是"名称 [...]那是命名空间N的成员"

句子的开头应该像这样解析:

设 F 为函数。
设 N 为命名空间。
让 X 成为一个名字。

如果在 F 的声明符 id 之后的 F 定义中使用 X,并且 X 是命名空间 N 的成员......

编辑:我被评论说服了,我上面的解释是错误的。我创建了 https://github.com/cplusplus/draft/issues/451 来请求改写该段落。

然而,这也是错误的:

我相信 3.4.1/6 忽略了在函数的参数声明子句中找到的函数体中使用的名称的查找,

首先,显然i是通过名称查找找到的,否则函数参数将不可用!

其次,3.3.3 [basic.scope.block]/2 说i有"块作用域",从它的声明点开始,到函数定义的右大括号结束。 3.4.6/6说"应在使用它的块中使用之前声明",在这种情况下也是如此。 i 在使用之前声明(其声明点在使用之前),并在使用它的块(函数的最外层块范围)中声明。