首页 > 解决方案 > '...'之前的预期主表达式,c ++编译错误

问题描述

SO上有很多类似标题的帖子,但它们似乎是由各种语法错误触发的,我还没有看到一致的模式..

using namespace std;

class A
{
public:
    A(int a_) : a(a_) {}
    int a;
};

int main()
{
    A x{3};
    A y{0};

    if ((y=x).a)
        cout << y.a << endl;
        
    int i = 1;
    if (int j = i)
        cout << j << endl;
    
    if ((A z = x).a) // error: expected primary-expression before ‘z’
        cout << z.a << endl;

    (int m = 1); // error: expected primary-expression before ‘int’
}

我错误地假设A z = x是一个赋值表达式,它应该具有相同的值z

标签: c++syntaxcompiler-errors

解决方案


我错误地假设A z = x是一个赋值表达式

是的,你错了。这里没有任务。此=语句中的 表示初始化,而不是赋值。该语句A z = x;定义变量z,其中z构造自x。这里使用的是复制构造函数,而不是复制赋值。它是声明语句,而不是表达式语句。

if您的困惑是相当普遍的,而且由于语句中的条件可以是使用大括号或等号初始化程序的单个非数组变量的声明,这一事实使情况变得更糟。从语法上讲,带有“等于”初始化器的声明看起来很像赋值。正如您所发现的,一个很大的区别是您不能将声明视为子表达式。条件是声明表达式而不是两者的混合

好消息是 C++-17在语句语法中添加了一个可选的initif语句。因此,您似乎想要的可以通过以下方式实现。

    if ( A z = x; z.a )  // Semicolon separates init-statement from condition
        cout << z.a << endl;
    // At the end of the `if` statement, `z` goes out of scope.

推荐阅读