在标准中它表示声明`auto f()() - > int;`是不允许的?

时间:2015-01-22 18:05:44

标签: c++ c++11 language-lawyer

我知道我在这里很迂腐,但我只是想了解C ++语法的产生。

我将从简单声明开始。

简单声明
DECL说明符-SEQ <子> 选择 初始化声明符列表 <子> 选择

DECL说明符-SEQ
DECL说明符

DECL说明符
类型说明符

类型说明符
拖尾型说明符

拖尾型说明符
简单型说明符

简单型说明符
焦炭
INT
...
自动


现在,我将研究 init-declarator-list 的定义。

初始化声明符列表
初始化声明符

初始化声明符
声明符

声明符
noptr-declarator 参数和限定符 尾随返回类型 (* 2)

noptr声明符
声明符-ID 属性说明符-SEQ <子> 选择
noptr-declarator 参数和限定符 (* 1)

参数和限定符
parameter-declaration-clause cv-qualifiers opt ...(所有选项)

后返回型
- &GT; 拖尾型说明符-SEQ

拖尾型说明符-SEQ
trailing-type-specifier 请参阅上面 traling-type-specifier 的定义。


使用 noptr-declaration的先前定义,通过(* 1)中的 declarator-id 替换 noptr-declarator ,我们得出 nonptr-declarator 的以下定义:

noptr声明
declarator-id 参数和限定符

现在替换(* 2) noptr-declarator ,参数和限定符 trailing-return-type >根据上面给出的每个定义,我们为声明符获取以下内容:

声明符
声明符-ID 参数声明子句)(参数声明子句)的 - &GT; <无线电通信/> 简单类型说明符


有了这个最后的结果,我们可以说语法允许函数f的以下声明:

auto f()() -> int;  

当然无效。但我无法在标准中找到任何直接或间接说明这种结构形成不良的内容。

来自GCC的错误消息(f声明为函数返回函数)和clangauto返回没有尾随返回类型;推导的返回类型是C + + 1y扩展名也没有帮助。

2 个答案:

答案 0 :(得分:11)

<强> [dcl.fct] / 8:

  

[...]函数不应具有类型数组或函数的返回类型,尽管它们可能具有类型指针的返回类型或对此类事物的引用。 [...]

答案 1 :(得分:9)

实际上,gcc错误消息非常有用:语法确实允许auto f()() -> int,但这种语法正确的声明在语义上是无效的。它将描述一个函数返回一个返回int的函数。请参阅ecatmur的答案,了解禁止使用的标准报价。

要理解解析,请像这样工作。 f是您要宣布的内容。向右解析,您将找到一个空参数列表,因此f()是一个有效的表达式,并声明该表达式的类型。再次向右解析,你会再次找到一个参数列表 ,因此f的返回类型是一个零参数的函数。向右再次解析,然后你将到达终点(->箭头),因此向左解析以找到结果类型,即auto,并被箭头后面的类型替换。