'...' 之前预期的主表达式,C++ 编译错误

QnA*_*QnA 0 c++ syntax compiler-errors

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

\n
using namespace std;\n\nclass A\n{\npublic:\n    A(int a_) : a(a_) {}\n    int a;\n};\n\nint main()\n{\n    A x{3};\n    A y{0};\n\n    if ((y=x).a)\n        cout << y.a << endl;\n        \n    int i = 1;\n    if (int j = i)\n        cout << j << endl;\n    \n    if ((A z = x).a) // error: expected primary-expression before \xe2\x80\x98z\xe2\x80\x99\n        cout << z.a << endl;\n\n    (int m = 1); // error: expected primary-expression before \xe2\x80\x98int\xe2\x80\x99\n}\n
Run Code Online (Sandbox Code Playgroud)\n

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

\n

JaM*_*MiT 5

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

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

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

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

    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.
Run Code Online (Sandbox Code Playgroud)