尾随返回类型中的类型 ID 歧义

莱东特

引用自标准:

尾随返回类型中的类型 ID 包括可能的最长抽象声明序列。

注意:这解决了数组和函数声明符的二义性绑定。

例子:

 auto f()->int(*)[4]; // function returning a pointer to array[4] of int
                      // not function returning array[4] of pointer to int

我想知道,这个给定的代码有什么不明确的地方?

标准中提到的歧义通常是由于语法本身的歧义,而在这种情况下,给定的字符序列总是被解释为尾随返回类型(即单一类型),并且不应该有歧义是哪个这是。

顺便说一句,为什么要引用type-id?我的意思是,形式上它只能出现在与尾随返回类型不同的代码位置。或者它只是非正式地提到,因为所有可以(由其本身)解析为尾随返回类型的东西也可以被解析为 type-id(由其本身)?我只是不太清楚标准中何时使用非终结符...

学习者

N2541中尾随返回类型可以出现在任何函数声明器中。这意味着auto (*f() -> int);一个有效的声明。那时auto f()->int(*)[4];可能会被解释为具有相同的含义auto (f()->int(*))[4];(声明f为函数返回指向 int 的指针的数组[4])。它也可以按照我们通常期望的方式进行解释,即它[4]尾随返回类型的一部分,并且声明声明了一个函数,该函数返回一个指向 int 数组 [4] 的指针。当时添加了引用的段落以解决这种歧义。

在 N2541 被投票纳入标准后,CWG 681改变了语法,以确保尾随返回类型只能出现在顶级函数声明符中因此[4]必须是trailing-return-type 的一部分不再有任何歧义。但是,CWG 681 并未删除消歧规则,这似乎是一个疏忽。

CWG 2040最近更正了这一疏忽,删除了现在无用的段落。


N2541还允许在符号之后出现类型标识->,这会在像auto f() -> struct S { };. 这是CWG 770并由N2927解析,它将trailing-return-type定义->后跟一个trailing-type-specifier-seq后跟一个可选的abstract-declarator的符号然而 N2927 不会修改消歧规则,即使现在trailing-return-type 中没有type-id是没有意义的

型-ID类型说明符-SEQ接着任选的抽象说明符那时,类类型或枚举类型定义可能出现在type-specifier-seq 中,但不会出现在trailing-type-specifier-seq 中这使得-> struct S {}一个无效的trailing-return-type,虽然struct S {}是一个有效的type-id

CWG 2141最近再次更改了语法,它将type-specifier-seq重命名definition-type-specifier-seq并将trailing-type-specifier-seq重命名type-specifier-seq型-ID仍然定义为一个类型说明符-SEQ接着任选的抽象说明符最终结果是类类型或枚举类型定义现在可能不会出现在type-id 中现在再次,任何类型的ID可以在符号之后出现->拖尾收益型

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章