7

§8/5:

trailing-return-type中的可选属性说明符 序列属于指示的返回类型。trailing-return-type中 的type-id包括可能最长的abstract-declarator序列。[注意:这解决了数组和函数声明符的模糊绑定。[ 例子:

auto f()->int(*)[4]; // function returning a pointer to array[4] of int
                     // not function returning array[4] of pointer to int

—结束示例] —结束说明]

尾随返回类型中的类型 ID ”对我来说没有意义,仅仅是因为根据语法,尾随返回类型不包含类型 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  
4

1 回答 1

5
int *f();

声明一个()返回指针的函数int

int *f()[4];

声明一个()返回由 4 个指针组成的数组的函数int。请注意,这是格式错误的。

int (*f())[4];

声明一个()返回指向数组 4的指针的函数int

现在,在

  auto f() -> int(*)[4]
//     ^^^^^^^^^^^^^---

该规则解决的是是否[4]trailing-return-type的一部分,因此是函数声明符的一部分。如果[4]trailing-return-type的一部分,那么上面的声明声明了一个()返回指向数组 4的指针的函数int

如果不是,那么[4]将形成一个不属于函数声明符的数组声明符,并且解析将由 [dcl.array]/p1 管理:

在有表格的声明T DD

D1 [ constant-expression_opt ] attribute-specifier-seq_opt

并且声明中标识符的类型T D1是“<em>derived-declarator-type-list T” [..., 如果] 常量表达式的值是N, [...] 标识符的类型D是“ <em>派生声明符类型列表数组N T”。

并且由于auto f()-> int (*)声明f为“()返回指针的函数int”,替换告诉我们这将声明一个函数返回一个由 4 个指针组成的数组int,就像int *f()[4];.

于 2015-04-06T22:15:14.503 回答