[英]Is this trailing return type legal in C++11?
下列:
auto (*f())() -> int;
在C ++ 11模式下使用Clang给出错误:
错误:“自动”返回而没有尾随返回类型; 推导的返回类型是C ++ 14扩展
但以C ++ 14模式编译。 GCC在使用-Wall -Wextra -pedantic
两种模式下编译时都不会抱怨。
n3337 7.1.6.4/2说:
在此类声明符有效的任何情况下,自动类型声明符都可能与带有尾随返回类型(8.3.5)的函数声明符一起出现。
8.3.5p2讨论了函数声明符,但是我对此经验不足。 谁能解释在C ++ 11中是否合法?
CWG 1725部分涵盖了这一点:
声明的处理方式如下:
auto (*f())() -> int; // #1
8.3.5 [dcl.fct]第2段似乎要求确定嵌套声明器的类型
auto (*f()); // #2
(C ++ 11)7.1.6.4 [dcl.spec.auto]格式错误,因为它没有尾随返回类型。 (在C ++ 14中,当然允许不带尾随返回类型的自动返回类型。)
理由(2013年9月):C ++ 11措辞的目的是,对尾随返回类型的要求仅适用于自动应用的声明器的顶层,而不适用于声明器处理中的每个可能的递归阶段。 [..]
此外,根据[dcl.fct] / 2 ,
在声明
TD
,D
具有以下形式
D1
(
参数声明子句)
尾随返回类型并且声明
T D1
包含的声明 符 id的类型为“ derived-declarator-type-listT
” ,T
应为单个type-specifierauto
。
如DR中所述, T D1
是auto (*f())
,其类型为“ ()
函数将指针返回auto
”(即,符合要求)。 因此,您的代码在C ++ 11和14中均有效,并且f
的类型为“ ()
函数返回指向()
函数返回int
指针”。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.