T数组的函数参数“衰减”到T的指针?

时间:2018-11-20 14:29:39

标签: c++ language-lawyer

如果我有功能...

void f(int x[3]) {}

...这与功能有区别...

void f(int* x) {}

如果没有,它在标准中解决此问题的地方是什么?

很显然,存在数组到指针的标准转换,但我认为它们不适用于此吗?

我似乎记得那种能说出这种效果的语言,但似乎找不到。

$ cat t.cc
void f(int x[3]) {}

void f(int* x) {}

$ g++ t.cc
t.cc: In function ‘void f(int*)’:
t.cc:3:6: error: redefinition of ‘void f(int*)’
 void f(int* x) {}
      ^
t.cc:1:6: note: ‘void f(int*)’ previously defined here
 void f(int x[3]) {}
      ^

3 个答案:

答案 0 :(得分:4)

  

如果我有功能...

void f(int x[3]) {}
     

...这与功能有区别...

void f(int* x) {}

不。这些声明是等效的。

标准草案:

  

[dcl.fct]

     

使用以下规则确定函数的类型。每个参数的类型(包括   函数参数包)由其自己的decl-specifier-seq和声明符确定。确定后   每个参数的类型,“ T的数组”类型或T的函数类型的任何参数都被调整为   “ T的指针”。 ...

此规则是对数组衰减规则的补充。数组衰减允许使用-显然-数组参数调用函数,而此规则允许使用-显然-数组参数声明函数,而实际上传递的是指针。这些规则源于该语言的C传统。与指针衰减功能相同。

答案 1 :(得分:3)

来自[dcl.fct§5](重点是我):

  

使用以下规则确定函数的类型。   每个参数(包括函数参数包)的类型取决于其自己的 decl-specifier-seq declarator 。   确定每个参数的类型后,将类型为“ T的数组”或函数类型为“ T”的任何参数调整为“指向T的指针”

答案 2 :(得分:2)

在函数声明符的规范中进行了描述

  

[dcl.fct]

     

5 [...]确定每个参数的类型后,   类型“ T的数组”或函数T的类型被调整为“指向   T”。 [...]