【发布时间】:2015-01-22 18:05:43
【问题描述】:
我知道我在这里很迂腐,但我只是想了解 C++ 语法产生。
我将从简单声明开始。
简单声明:
decl-specifier-seqopt init-declarator-listopt
decl-specifier-seq:
decl-说明符
decl-specifier:
类型说明符
类型说明符:
尾随类型说明符
尾随类型说明符:
简单类型说明符
简单类型说明符:
字符
整数
...
自动
现在,我将研究 init-declarator-list 的定义。
init-declarator-list:
初始化声明器
初始化声明符:
声明符
声明符:
noptr-declarator 参数和限定符 尾随返回类型 (*2)
noptr 声明符:
declarator-id attribute-specifier-seqopt
noptr-declarator 参数和限定符 (*1)
参数和限定符:
(parameter-declaration-clause) cv-qualifiersopt ...(所有选项)
尾随返回类型:
-> 尾随类型说明符序列
尾随类型说明符序列:
trailing-type-specifier 参见上面的trailing-type-specifier的定义。
在(*1)中用declarator-id替换noptr-declarator,使用noptr-declaration的先前定义,我们得出以下nonptr-declarator的定义:
noptr 声明:
declarator-id 参数和限定符
现在替换 (*2) 中的 noptr-declarator、parameters and qualifiers 和 trailing-return-type > 根据上面给出的每个定义,我们为 declarator 获得以下内容:
声明符:
declarator-id (parameter-declaration-clause) (parameter-declaration-clause) ->
简单类型说明符
根据最后一个结果,我们可以说语法允许以下函数声明f:
auto f()() -> int;
这当然是无效的。但我在标准中找不到任何直接或间接说明这种结构不正确的内容。
来自GCC(f 声明为返回函数的函数)和clang(auto 返回没有尾随返回类型;推断的返回类型是 C++1y 扩展)的错误消息没有帮助在这方面也是。
【问题讨论】:
-
这是不允许的,因为标准中没有描述这种语法的语法。这就像说
int f(){} * 100是不允许的,但我在标准中没有找到任何不允许它的东西。 -
你在这里掩盖了真正的错误,它试图定义一个返回函数的函数。
int f()()同样无效。 -
您如何到达
auto f()() -> int;?你说“有了最后一个结果,我们可以....” -
@POW 在简单声明中,使 simple-type-specifier =
auto。然后使 declarator-id =f,依此类推。
标签: c++ c++11 language-lawyer