Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/136.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 是";int(x),1&引用;模棱两可的声明?_C++_Syntax_Expression_Language Lawyer_Variable Declaration - Fatal编程技术网

C++ 是";int(x),1&引用;模棱两可的声明?

C++ 是";int(x),1&引用;模棱两可的声明?,c++,syntax,expression,language-lawyer,variable-declaration,C++,Syntax,Expression,Language Lawyer,Variable Declaration,Clang编译它,GCC不编译。哪种编译器是正确的?在我看来,中的措辞在以下方面已经足够清楚: 带有函数式显式类型转换的表达式语句最左边的子表达式与第一个声明符以开头的声明是无法区分的(在这些情况下该语句是一个声明 [注意:如果语句在语法上不能是声明,则不存在歧义,因此此规则不适用。可能需要检查整个语句以确定是否存在这种情况。 这个措辞表达了一个完整的(表达)陈述。 您的语句无法解析为声明,因为词素1在语法上不是声明符。没有歧义:如果我们只看int(x),它可能看起来有歧义,但该标准明确否认,如

Clang编译它,GCC不编译。哪种编译器是正确的?

在我看来,中的措辞在以下方面已经足够清楚:

带有函数式显式类型转换的表达式语句最左边的子表达式与第一个声明符以
开头的声明是无法区分的(
在这些情况下该语句是一个声明

[注意:如果语句在语法上不能是声明,则不存在歧义,因此此规则不适用。可能需要检查整个语句以确定是否存在这种情况。

这个措辞表达了一个完整的(表达)陈述。 您的语句无法解析为声明,因为词素
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
并获取三个参数。前两个参数的类型 参数是
,每个参数后面都有一个 冗余括号中的参数名称。第三个参数的类型 无法确定参数,因为它是文本。
这将 导致语法错误
  • latt的声明声明了一个对象, 因为另一个选项(函数声明)将导致 语法错误。请注意“[Note:”前面的最后一句不是 这很有帮助,因为两个选项都是声明
  • Steve Adamczyk:很多人在上回复了这个帖子 C.P.S.D.c++表示他们没有看到问题。>/P> 原著 海报回复:

    除了同意你的论点,我什么也做不了。所以有 对第8.2条【dcl.ambig.res】只有一种正确的解释 第1段,但我必须说,经过一些改写,该条款 可以说得更清楚,比如明确指出 必须考虑到声明和函数声明 与对象声明相比,它们更受欢迎

    我想提出以下建议,以取代当前的 第8.2条【dcl.ambig.res】第1款:

    函数样式转换之间的相似性引起的歧义 以及6.8[stmt.ambig][…]中提到的声明

    工作组认为目前的措辞已经足够清楚。


    看起来是正确的。但重点是什么?我看不出有什么理由不编译。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 */   
    }