繁体   English   中英

标准中的哪个地方表示声明`auto f()() - > int;`是不允许的?

[英]Where in the Standard does it say that the declaration `auto f()() ->int;` is not allowed?

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

我将从一个简单的声明开始

简单声明
decl-specifier-seq opt init-declarator-list opt

decl-specifier-seq
DECL说明符

decl-specifier
类型说明符

类型说明符
拖尾型说明符

trailing-type-specifier
简单型说明符

简单类型说明符
烧焦
INT
...
汽车


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

init-declarator-list
初始化声明符

init-declarator
声明符

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

noptr-declarator
declarator-id attribute-specifier-seq opt
noptr-declarator 参数和限定符 (* 1)

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

trailing-return-type
- > trailing-type-specifier-seq

trailing-type-specifier-seq
trailing-type-specifier请参阅上面的traling-type-specifier的定义。


(* 1)中declarator-id替换noptr-declarator ,使用之前的noptr-declaration定义,我们得到了nonptr-declarator的以下定义:

noptr-declaration
declarator-id 参数和限定符

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

声明者
declarator-idparameter-declaration-clause )( 参数声明子句- >
简单型说明符


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

auto f()() -> int;  

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

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

[dcl.fct] / 8:

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

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM