这种尾随返回类型在C++11中合法吗

Is this trailing return type legal in C++11?

本文关键字:C++11 返回类型      更新时间:2023-10-16

以下内容:

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

在C++11模式中给出一个错误,Clang说:

错误:"auto"返回,没有尾随返回类型;推断收益类型是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措辞的目的是,对尾随返回类型的要求仅适用于auto适用的声明器的顶层,而不适用于声明器处理中的每个可能的递归阶段[..]

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

在声明T D中,其中D的形式为

 nbsp nbsp D1(参数声明子句)[…]尾随返回类型

并且声明T D1中包含的声明符id的类型为">派生的声明符类型列表T">T应为单个类型说明符auto

如DR中所述,T D1auto (*f()),其类型为"()返回指向auto的指针的函数"(即符合要求)。因此,您的代码在C++11和14中都是有效的,并且f的类型是"()的函数返回指针到()的函数返回int"。