以下内容:
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中是否合法吗?
答案 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 D
中D
的格式为
D1
(
parameter-declaration-clause)
[...] trailing-return-type,声明
T D1
中包含的 declarator-id 的类型为“ derived-declarator-type-list {{1} }“,T
应为单个类型说明符T
。
如DR中所述,auto
为T D1
,其类型为“auto (*f())
的函数,返回指向()
的指针”(即匹配要求)。因此,您的代码在C ++ 11和14中均有效,而auto
的类型是“f
的函数,返回指向()
返回()
”函数的指针。