§8/ 5:
trailing-return-type 中的可选 attribute-specifier-seq 属于指定的返回类型。 a中的 type-id trailing-return-type 包含 abstract-declarator 的最长序列。 [注意:这解决了数组和函数声明符的模糊绑定。 [例如:
auto f()->int(*)[4]; // function returning a pointer to array[4] of int // not function returning array[4] of pointer to int
-end example] -end note]
trailing-return-type 中的“ type-id ”对我来说没有意义,只是因为 trailing-return-type < / em>根据语法不包含 type-id 。
我也不理解数组和函数声明的“模糊绑定”。据我所知
auto f() -> int*[4]; // function returning an array of 4 pointers to int
auto f() -> int(*)[4]; // function returning a pointer to an array of 4 ints
答案 0 :(得分:5)
int *f();
声明()
的函数返回指向int
的指针。
int *f()[4];
声明()
函数返回指向int
的4个指针的数组。请注意,这是不正确的。
int (*f())[4];
声明()
的函数返回指向4 int
数组的指针。
现在,在
auto f() -> int(*)[4]
// ^^^^^^^^^^^^^---
规则解决的是[4]
是否是 trailing-return-type 的一部分,因此是函数声明符的一部分。如果[4]
是 trailing-return-type 的一部分,则上述声明声明()
函数返回指向4 int
数组的指针。
如果没有,则[4]
将形成一个不属于函数声明符的数组声明符,并且该解析将由[dcl.array] / p1管理:
在声明
T D
中D
的格式为D1 [ constant-expression_opt ] attribute-specifier-seq_opt
和声明
T D1
中的标识符类型是 “ derived-declarator-type-listT
”[...,if]的值 常量表达式为N
,[{1}}的标识符类型为。{1}} “{em> derived-declarator-type-listD
N
”数组。
并且由于T
将auto f()-> int (*)
声明为f
返回指针()
&#34;的函数,因此替换告诉我们这将声明一个函数返回指向int
的4个指针数组,就像int
一样。