这个尾随返回类型在C ++ 11中是否合法?

时间:2016-05-27 23:45:36

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

以下内容:

auto (*f())() -> int;

在C ++ 11模式下出错,Clang说:

  

错误:' auto'返回没有尾随返回类型;推断回报   types是C ++ 14扩展

但在C ++ 14模式下编译。 GCC使用-Wall -Wextra -pedantic在两种模式下都没有抱怨。

n3337 7.1.6.4/2说:

  

自动类型说明符可能与函数声明符一起出现   在这样的声明者所在的任何上下文中的trailing-return-type(8.3.5)   有效的。

8.3.5p2讨论了函数声明者,但我没有经验可以搞清楚。任何人都可以解释它在C ++ 11中是否合法吗?

1 个答案:

答案 0 :(得分:3)

这部分由CWG 1725

涵盖
  

对以下声明的处理不明确:

auto (*f())() -> int; // #1
     

8.3.5 [dcl.fct]第2段似乎要求确定嵌套声明符的类型

auto (*f()); // #2
     

其中,因为它没有   trailing-return-type,将由(C ++ 11)7.1.6.4组成   [dcl.spec.auto]。 (在C ++ 14中,没有a的自动返回类型   当然,允许使用trailing-return-type。)

     

基本原理(2013年9月):C ++ 11措辞的目的是对尾随返回类型的要求仅适用于自动应用的声明者的顶层,而不是每个可能的递归声明者处理阶段。 [..]

此外,根据[dcl.fct]/2

  

在声明T DD的格式为

     

D1 ( parameter-declaration-clause ) [...] trailing-return-type

     

,声明T D1中包含的 declarator-id 的类型为“ derived-declarator-type-list {{1} }“T应为单个类型说明符 T

如DR中所述,autoT D1,其类型为“auto (*f())的函数,返回指向()的指针”(即匹配要求)。因此,您的代码在C ++ 11和14中均有效,而auto的类型是“f的函数,返回指向()返回()”函数的指针。