![](/img/trans.png)
[英]Where does the C++ standard say, and does C say the same: variables in a compilation unit (.cpp file) are initialised in order of declaration
[英]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-clause ) cv-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-id ( parameter-declaration-clause )( 参数声明子句 ) - >
简单型说明符
有了这个最后的结果,我们可以说语法允许函数f
的以下声明:
auto f()() -> int;
这当然是无效的。 但我无法在标准中找到任何直接或间接说明这种结构不正确的内容。
来自GCC
的错误消息( f
声明为函数返回函数)和clang
( auto
返回没有尾随返回类型;推断的返回类型是C ++ 1y扩展)在这方面也没有帮助。
[dcl.fct] / 8:
[...]函数不应具有类型数组或函数的返回类型,尽管它们可能具有类型指针的返回类型或对此类事物的引用。 [...]
实际上,gcc错误消息非常有用:语法实际上允许auto f()() -> int
,但这种语法正确的声明在语义上是无效的。 它将描述一个函数返回一个返回int
的函数。 请参阅ecatmur的答案,以获取禁止使用的标准报价。
要理解解析,请像这样工作。 f
是你想要宣布的。 向右解析,您将找到一个空参数列表,因此f()
是一个有效的表达式,并声明该表达式的类型。 再次向右解析,你会再次找到一个参数列表,所以f
的返回类型是一个零参数的函数。 向右再次解析,然后你将到达终点( ->
箭头),因此向左解析以找到结果类型,即auto,并被箭头后面的类型替换。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.