当名称出现在函数的声明符 ID 之前时,查找规则是什么?

jac*_*k X 2 c++ language-lawyer

#include <iostream>

typedef int Name;
Name func(int){
  return 0;
}

int main(){
}
Run Code Online (Sandbox Code Playgroud)

考虑上面的代码,我无法找到[basic.lookup.unqual]子弹可以解释如何查找Name的定义func。我将在这里引用一些潜在的规则:

  1. 在全局范围内使用的名称,在任何函数、类或用户声明的命名空间之外,应在其在全局范围内使用之前声明。

  2. 任何函数或类的定义之外的用户声明的命名空间中使用的名称应在其在该命名空间中使用之前或在其包含其命名空间的命名空间中使用之前声明。

  3. 在作为命名空间 N 成员的函数的定义中,在函数的 declarator-id 之后使用的名称应在使用它的块或其封闭块之一([stmt.block] ) 或应在使用命名空间 N 之前声明,或者,如果 N 是嵌套命名空间,则应在使用 N 的封闭命名空间之一之前声明

请注意强调的部分,似乎我的情况不满足这些项目符号,因为函数定义具有形式

功能定义:

属性说明符-seq(opt) decl-specifier-seq(opt) 声明符virt-specifier-seq(opt) 函数体

让我分析第一个子弹。它说在任何函数之外,但根据Function definitions rule,我认为Name在函数(定义)内,项目符号 1 不满足。Bullet 2 与 Bullet 1 相似。 Bullet 3 表示在函数的 declarator-id 之后使用的名称,在我的情况下,Name在函数的 declarator-id 之前使用。那么这种情况下查找不合格名称的规则是什么Name

我的困惑:

在我的示例中Namefunc(int){ return 0;}(函数体)都是该函数定义的一部分,所以:

  1. 什么是所有功能之外,比如func在我的例子,在那里的那个函数以外的地区?
  2. 任何函数的定义之外是什么,例如func我的示例中的定义,该函数定义之外的区域在哪里?

Nic*_*las 6

我认为这Name是在功能(定义)内,项目符号 1 不满足。

Bullet 1 没有说“功能(定义)”。它说“在任何功能之外”。它不指定声明或定义;仅仅是“在任何功能之外”。

由于在“函数”的内部或外部不是一个定义的概念,因此它必须被理解为简单的英语。函数原型是“函数之外”吗?从视觉上讲,暗示内部/外部区别的函数原型并没有什么特别之处。相比之下,函数体的块作用域确实暗示了内部/外部的区别。

课文的意图当然是很明显的;它在谈论函数体。该规则等同于“函数”、“类”和“命名空间”,所有这些都有一个定义名称范围的块。这是任何内部/外部区别的最合乎逻辑的地方,因此很明显,全局范围由不在函数体范围、类定义范围或范围内的所有内容组成命名空间主体。

因此,这可以通过编辑更改轻松处理。


请注意,委员会认为本节(以及该领域的其他内容)的措辞有些缺陷,并且有一项建议将其重写为在 C++23 中更加连贯的内容。提案中的新措辞完全重写了这一部分。