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;  
这当然是无效的.但我无法在标准中找到任何直接或间接说明这种结构不正确的内容.
来自GCC(f声明为函数返回函数)和clang(auto返回没有尾随返回类型;推断的返回类型是C++ 1y扩展)的错误消息在这方面也没有帮助.
实际上,gcc错误消息非常有用:语法确实允许auto f()() -> int,但这种语法正确的声明在语义上是无效的.它将描述返回函数返回的函数int.请参阅ecatmur的答案,以获取禁止使用的标准报价.
要理解解析,请像这样工作.f是你要宣布的.向右解析,您将找到一个空参数列表,因此f()是一个有效的表达式,并声明该表达式的类型.再次向右解析,你会再次找到一个参数列表,所以返回类型f是一个零参数的函数.向右再次解析,然后您将点击结束(->箭头),因此向左解析以查找结果类型(auto),并替换为箭头后面的类型.
| 归档时间: | 
 | 
| 查看次数: | 272 次 | 
| 最近记录: |