标准N4296::3.3.4/1 [basic.scope.proto]
:
在函数声明中,或在除。之外的任何函数声明符中 函数定义的声明者(8.4),参数名称(如果 供应)具有功能原型范围,最终终止 最近的封闭函数声明符。
我尝试了以下示例:
1
template<const int a>
class A{ };
const int a = 4;
A<a> b; // OK
void foo(const int a = 4, A<a>); //non-type template argument is
//not a constant expression
2
void foo(const int a = 4, int b = a); //default argument references parameter 'a'
我们如何使用此范围的功能?它的用途是什么?
答案 0 :(得分:4)
这是一个人为的例子:
void foo(overly::long_type::which_should_be_a_typedef_anyway a, decltype(a) b); // fine
decltype(a) c; // oops, a not declared
答案 1 :(得分:3)
我认为这一点就是说下面的代码是有效的:
extern int somefunc(int a, char *b, int c);
int somefunc(int, char *, int);
int somefunc(int number, char *bytes, int ipv4_address)
{
…
}
名称a
,b
和c
在extern
声明的右括号中失去了重要性。在声明者中,名称在int somefunc(int a, char *a, int a);
无效的范围内很重要,因为在需要不同标识符的地方使用相同的名称a
。
名称number
,bytes
和ipv4_address
在闭括号中不会失去意义,因为这是“函数定义的声明者”;它们成为函数中变量的名称。
请注意,Stroustrup明确拒绝将函数声明中的参数名称绑定到函数定义中的参数名称。 Design and Evolution of C++中有一节讨论了这一点。
答案 2 :(得分:1)
要添加到user657267的示例, trailing-return-type 通常取决于此功能:
template<class A, class F>
auto foo(const A& a, const F& f) -> decltype(f(a));