C++ 是";int(x),1&引用;模棱两可的声明?
Clang编译它,GCC不编译。哪种编译器是正确的?在我看来,中的措辞在以下方面已经足够清楚: 带有函数式显式类型转换的表达式语句最左边的子表达式与第一个声明符以C++ 是";int(x),1&引用;模棱两可的声明?,c++,syntax,expression,language-lawyer,variable-declaration,C++,Syntax,Expression,Language Lawyer,Variable Declaration,Clang编译它,GCC不编译。哪种编译器是正确的?在我看来,中的措辞在以下方面已经足够清楚: 带有函数式显式类型转换的表达式语句最左边的子表达式与第一个声明符以开头的声明是无法区分的(在这些情况下该语句是一个声明 [注意:如果语句在语法上不能是声明,则不存在歧义,因此此规则不适用。可能需要检查整个语句以确定是否存在这种情况。 这个措辞表达了一个完整的(表达)陈述。 您的语句无法解析为声明,因为词素1在语法上不是声明符。没有歧义:如果我们只看int(x),它可能看起来有歧义,但该标准明确否认,如
开头的声明是无法区分的(
在这些情况下该语句是一个声明
[注意:如果语句在语法上不能是声明,则不存在歧义,因此此规则不适用。可能需要检查整个语句以确定是否存在这种情况。
这个措辞表达了一个完整的(表达)陈述。
您的语句无法解析为声明,因为词素1
在语法上不是声明符。没有歧义:如果我们只看int(x),它可能看起来有歧义
,但该标准明确否认,如果语句的某个前缀解析为声明,则整个语句被视为潜在声明
事实上,核心专家早在2002年就有过非常相似的讨论——我强调了重要的部分。这里,我们有一个假设的声明,其中包含一个不兼容的子结构
考虑以下计划:
void f(int x) {
int (x), 1;
}
该问题与标记为/*line X*/
的行有关,该行不明确
对象或函数的声明
第8.2条[dcl.ambig.res]第1款规定了这种歧义,内容如下:
由于函数样式之间的相似性而产生的歧义
第6.8节[stmt.ambig][…]中提到的演员阵容和声明
根据这一条款,有两种情况
第X行中声明的可能解释:
- latt的声明
声明了一个返回值为
键入Lattice
并获取三个参数。前两个参数的类型
参数是点
,每个参数后面都有一个
冗余括号中的参数名称。第三个参数的类型
无法确定参数,因为它是文本。这将
导致语法错误
看起来是正确的。但重点是什么?我看不出有什么理由不编译。gcc会产生什么错误?编辑:它似乎在抱怨本地
x
隐藏了参数x
。据我所知,虽然这是个坏主意,但这是允许的。@FrançoisAndrieux这看起来很像int x的声明,
。而你是在中重新允许附加括号declarations@Stephen具有void f(){…}
编译没有问题。如果任何地方都没有主函数,那将是链接器错误。但编译不包含主函数的代码实际上是常见的错误case@RegisPortalez当前位置这是一个精简的示例,因此它可能看起来毫无意义,但事实并非如此。感谢您的回答!现在很明显,clang是正确的。但是,在我看来n、 目前的措辞应该改进。因为,它在1的结尾处声明:“在这些情况下,语句是一个声明。”然后,注释告诉我们,这个声明并不总是正确的,但只有在语句在语法上可以是一个声明的情况下。这可能有点令人困惑。1的结尾应该是这样的在这种情况下,如果整个语句可以是语法正确的声明,那么它就是一个声明
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 */
}