功能参数名称的范围

时间:2014-05-18 18:43:44

标签: c++ scope

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

function prototype scope

但是函数原型范围是什么意思?

2 个答案:

答案 0 :(得分:2)

来自C ++ 2011国际标准

  

3.3.4函数原型范围[basic.scope.proto]

     

1 在函数声明中,或在除声明符之外的任何函数声明符中   函数定义(8.4),参数名称(如果提供)具有   函数原型范围,终止于最近的结尾   封闭函数声明符。

例如,

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

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

另一方面,

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

是合法的。

答案 1 :(得分:2)

你正在考虑的文字(我假设)是:

  

3.3.4函数原型范围[basic.scope.proto]

     

1在函数声明中,或在除声明符之外的任何函数声明符中   功能定义(8.4),参数名称(如果提供)具有   函数原型范围,终止于最近的结尾   封闭函数声明符。

在函数声明中,例如void foo(int x, int y);,参数x的范围是3.3.2,紧跟在其完整的声明符之后(即紧跟在{{1}之后) })。它的作用域在封闭函数声明符的末尾结束,即结束声明的x

在谈论函数定义时,参数的范围是块范围(强调我的):

  

3.3.3块范围[basic.scope.local]

     

1块(6.3)中声明的名称是该块的本地名称;它有   阻止范围。它的潜在范围始于其声明点   (3.3.2)并在其块结束时结束。块处声明的变量   scope是局部变量

     

2 函数参数名称的潜在范围(包括一个   出现在 lambda-declarator )或函数本地预定义中   函数定义中的变量(8.4)从它的角度开始   宣言。如果该函数具有 function-try-block 的潜力   参数范围或函数本地预定变量的结尾   最后一个关联处理程序的结尾,否则它在结尾处结束   函数定义的最外面的块。参数名称   不得在该函数的最外层重新声明   定义也不在与a关联的任何处理程序的最外面的块中   功能试块

基本上,它表示参数的范围以定义的右括号结束。