gez*_*eza 15 c++ syntax expression variable-declaration language-lawyer
void f(int x) {
int (x), 1;
}
Run Code Online (Sandbox Code Playgroud)
Clang编译它,GCC没有.哪个编译器正确?
Col*_*mbo 17
国际海事组织,[stmt.ambig]的措辞对此很清楚:
具有函数样式显式类型转换的表达式语句作为其最左侧的子表达式,与第一个声明符以a开头的声明无法区分
(
.在这些情况下,该声明是一个声明.[ 注意:如果语句在语法上不能成为声明,则不存在歧义,因此该规则不适用.可能需要检查整个陈述以确定是否是这种情况.
措辞说明了整个(表达式)陈述.您的语句不能被解析为声明,因为1
词法在语法上不是声明者.没有含糊之处:如果我们单独看,它可能看起来很模糊int(x)
,但标准明确否认如果语句的某些前缀作为声明解析,则整个语句被认为是潜在的声明.
事实上,核心专家在2002年就核心问题340进行了非常类似的讨论---我强调了重点.在这里,我们再次假设包含不兼容的子构造的声明.
考虑以下程序:
Run Code Online (Sandbox Code Playgroud)struct Point { Point(int){} }; struct Lattice { Lattice(Point, Point, int){} }; int main(void) { int a, b; Lattice latt(Point(a), Point(b), 3); /* Line X */ }
该问题涉及标记的行
/* Line X */
,这是对象或函数的模糊声明.管理这种歧义的条款是8.2 [dcl.ambig.res]第1段,内容如下:函数式转换与6.8 [stmt.ambig] [...]中提到的声明之间的相似性引起的模糊性
根据该条款,对该声明有两种可能的解释
X
:
- 声明
latt
声明一个函数,其返回值为类型Lattice
并带有三个参数.前两个参数的类型是Point
,这些参数中的每一个都在冗余括号中后跟一个参数名称.无法确定第三个参数的类型,因为它是文字.这将导致语法错误.- latt的声明声明了一个对象,因为另一个选项(函数声明)会导致语法错误.请注意,"[注意:"]之前的最后一句话没有多大帮助,因为这两个选项都是声明.
Steve Adamczyk:很多人在comp.std.c ++上回复了这篇帖子,说他们没有看到问题.
原来的海报回复说:
我不能做任何事情,只能同意你的论证.因此,对第8.2条[dcl.ambig.res]第1段只有一个正确的解释,但我必须说,通过一些重新措辞,该条款可以更加清楚,例如明确说明必须将整个声明用于帐户和函数声明比对象声明更受欢迎.
我想建议以下内容作为现行第8.2条的替代[dcl.ambig.res]第1段:
函数式演员与6.8 [stmt.ambig] [...]中提到的声明之间相似性引起的模糊性
工作组认为目前的措辞足够清楚.
归档时间: |
|
查看次数: |
417 次 |
最近记录: |