无法在变量c ++的初始化中包含多个表达式
Posted
技术标签:
【中文标题】无法在变量c ++的初始化中包含多个表达式【英文标题】:unable to include multiple expressions in initialization of a variable c++ 【发布时间】:2021-10-18 18:17:41 【问题描述】:在cppreference.com网站上有说明,类似的东西
对于每个声明器,初始化器可能是以下之一:
( 表达式列表 ) (1)
= 表达式 (2)
初始化列表 (3)
任意表达式的逗号分隔列表和括号中的花括号初始化列表
但在我的代码中
int main()
int a,b=5,c(a,b);
return 0;
当我尝试编译时,出现以下错误
...错误:表达式列表在初始化程序 [-fpermissive] 中被视为复合表达式
我的问题是,如果在这种初始化风格中允许多个表达式列表,那么为什么编译器不接受变量c
?
我错过了什么?
【问题讨论】:
你希望c(a,b)
做什么?
只是测试我对该概念的了解(包括变量初始化中的逗号分隔列表),预计没问题,但正在生成编译时错误。
您是否希望c
的类型为int
?你如何期望c(a,b)
初始化一个int
?
a,b
不能是表达式列表(因为 int 没有构造函数)。这是一个引起歧义的地方的逗号表达式,有效的初始化程序是c((a,b))
。
我认为这里的答案将是“有效语法不保证可以编译的代码”
【参考方案1】:
好吧,让我们看看这个:
int main()
int a,b=5,c(a,b);
return 0;
您希望 c(a,b) 实际做什么?
让我们稍微简化一下:
int main()
int a,b=5;
int c(a,b);
return 0;
这将产生相同的语法错误,但它现在是独立的。所以...
如果有一个将两个整数作为参数的 int 构造函数,您的代码就可以工作。这也可以编译:
int c(int a, int b);
但在这种情况下,您实际上是在定义一个函数。
另外,这可行:
int main()
int a = 5;
int b = 10;
int c(b);
std::cout << "C == " << c << std::endl;
之所以有效,是因为可以从单个 int 初始化 int。但是你得到一个错误,因为你不能从其他两个 int 初始化一个 int。
这行得通:
#include <iostream>
class MyClass
public:
MyClass(int a, int b): value(a + b)
int value;
;
int main()
int a = 5;
int b = 10;
MyClass c(a, b);
std::cout << "C == " << c.value << std::endl;
也许这就是您阅读的文章试图告诉您的。注意:cpppreference 不是学习 C++ 的好站点。买一本好书。
【讨论】:
请给我推荐一本好书,通过阅读,我不需要从任何其他来源查阅,它彻底解释了我的概念,引导我从初学者到高级,请告诉我为什么那个网站不适合学习 c++? cpppreference 是一个参考站点。它试图成为一个教程网站,但我不认为它做得很好,尤其是对于初学者。其他人可能不同意我的观点。至于好的 C++ 书籍——我使用的那些都是 90 年代的,而且已经过时了。但是,如果您在 Google 上搜索“优秀的 C++ 书籍”,您会得到很多提供建议的人。 它没有试图成为一个教程网站。它的目标受众是熟练工,而不是学徒。以上是关于无法在变量c ++的初始化中包含多个表达式的主要内容,如果未能解决你的问题,请参考以下文章