我们如何在函数声明中使用函数参数?

时间:2015-01-21 05:31:01

标签: c++

标准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

DEMO

2

void foo(const int a = 4, int b = a); //default argument references parameter 'a'

DEMO

我们如何使用此范围的功能?它的用途是什么?

3 个答案:

答案 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)
{
    …
}

名称abcextern声明的右括号中失去了重要性。在声明者中,名称在int somefunc(int a, char *a, int a);无效的范围内很重要,因为在需要不同标识符的地方使用相同的名称a

名称numberbytesipv4_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));