引用自标准:
尾随返回类型中的类型 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] 删除。
我来说两句