如果我有功能...
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]) {}
^
答案 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”。 [...]