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

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扩展)的错误消息在这方面也没有帮助.

eca*_*mur 11

[dcl.fct]/8:

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


Mic*_*her 9

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

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