关于规范中的§8/ 5,我需要一些帮助

时间:2015-04-06 21:06:33

标签: c++ language-lawyer c++14 trailing-return-type

§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  

1 个答案:

答案 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 DD的格式为

D1 [ constant-expression_opt ] attribute-specifier-seq_opt
     

和声明T D1中的标识符类型是   “ derived-declarator-type-list T”[...,if]的值   常量表达式为N,[{1}}的标识符类型为。{1}}   “{em> derived-declarator-type-list D N”数组。

并且由于Tauto f()-> int (*)声明为f返回指针()&#34;的函数,因此替换告诉我们这将声明一个函数返回指向int的4个指针数组,就像int一样。