函数参数名称的作用域

Scope of function parameter name

本文关键字:作用域 参数 函数      更新时间:2023-10-16

c++中函数参数名的作用范围是什么?我发现这个作用域是

function prototype scope

但是函数原型作用域是什么意思?

你所指的文本(我假设)是:

3.3.4函数原型作用域[basic.scope.]原型)

1在函数声明中,或在任何函数声明中,除了a的声明符函数定义(8.4),参数名(如果提供)有函数原型作用域,它在最近的结束处终止封闭函数声明符。

在函数声明中,例如void foo(int x, int y);,参数x的作用域,按照3.3.2,紧接在它的完整声明符之后(即紧接在x之后)。它的作用域结束于封闭函数声明符的末尾,即结束声明的;

在讨论函数定义时,参数的作用域是块作用域(重点是我的):

3.3.3块作用域[basic.scope]本地)

1在块中声明的名称(6.3)是该块的局部名称;它有块范围。它的潜在作用域从声明点开始(3.3.2),并在其块的末端结束。在块中声明的变量作用域是一个局部变量

2 函数形参名的潜在作用域(包括一个)出现在lambda声明器()或函数局部预定义中(8.4) 从它的点开始声明。如果函数有函数,try-block数名不能在函数的最外层块中重新声明类关联的任何处理程序的最外层块中没有定义 function-try-block .

基本上,它表示形参的作用域以定义的右括号结束

来自c++ 2011国际标准

3.3.4函数原型作用域[basic.scope.proto]

1在函数声明中,或在任何函数声明中,除了a的声明符函数定义(8.4),参数名(如果提供)有函数原型作用域,它在最近的结束处终止封闭函数声明符。

例如,

auto bar(void (*x)(int y)) -> decltype(y);

是非法的,因为y的作用域结束于void (*x)(int y)(最近的封闭函数声明符)的末尾。

另一方面,
void bar(auto (*x)(int y) -> decltype(y));

是合法的。