Ayr*_*osa 4 c++ language-lawyer c++11
我知道我在这里很迂腐,但我只是想了解C++的语法生成.
我将从一个简单的声明开始.
simple-declaration:
decl-specifier-seq opt init-declarator-list opt
decl-specifier-seq:
decl-specifier
decl-specifier:
类型说明符
type-specifier:
trailing-type-specifier
trailing-type-specifier:
simple-type-specifier
simple-type-specifier:
char
int
...
auto
现在,我将研究init-declarator-list的定义.
init-declarator-list:
init-declarator
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的定义.
更换noptr声明符由声明符-ID的(*1) ,使用以前的定义noptr声明,我们在下面的定义到达nonptr说明符:
noptr-declaration:
declarator-id 参数和限定符
现在更换noptr说明符,参数和限定符和尾返回型中(*2)由上面给出的各定义,得到以下说明符:
declarator:
declarator-id (parameter-declaration-clause)(parameter-declaration-clause) - >
simple-type-specifier
有了这个最后的结果,我们可以说语法允许以下函数声明f:
auto f()() -> int;
Run Code Online (Sandbox Code Playgroud)
这当然是无效的.但我无法在标准中找到任何直接或间接说明这种结构不正确的内容.
来自GCC(f声明为函数返回函数)和clang(auto返回没有尾随返回类型;推断的返回类型是C++ 1y扩展)的错误消息在这方面也没有帮助.
实际上,gcc错误消息非常有用:语法确实允许auto f()() -> int,但这种语法正确的声明在语义上是无效的.它将描述返回函数返回的函数int.请参阅ecatmur的答案,以获取禁止使用的标准报价.
要理解解析,请像这样工作.f是你要宣布的.向右解析,您将找到一个空参数列表,因此f()是一个有效的表达式,并声明该表达式的类型.再次向右解析,你会再次找到一个参数列表,所以返回类型f是一个零参数的函数.向右再次解析,然后您将点击结束(->箭头),因此向左解析以查找结果类型(auto),并替换为箭头后面的类型.
| 归档时间: |
|
| 查看次数: |
272 次 |
| 最近记录: |