c++ - '...'之前的预期主表达式,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
?
解决方案
我错误地假设
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.
推荐阅读
- python - TensorFlow 未使用所有系统内存
- windows - 如何控制 Windows 10 UWP App 的子窗口大小+位置
- sql-server - 监控何时创建数据库并接收电子邮件
- wordpress - 多个重定向 (301)
- javascript - 如何在 react-native-tab-view 中使用 renderScene 将道具传递给 FlatList?
- jquery - 如何根据内部文本末尾的数字对列表项进行排序?
- windows - 使用 PowerShell 验证注册表项
- sql - 在 Entity Framework Core 3.1 中调试 SqlException
- html - 是否有充分的理由让 html 标签保持打开状态?
- javascript - 我可以抓住元素 onmouseover 的类并在变量中使用它吗?