【问题标题】:unable to include multiple expressions in initialization of a variable c++无法在变量c ++的初始化中包含多个表达式
【发布时间】:2021-10-18 18:17:41
【问题描述】:

cppreference.com网站上有说明,类似的东西

对于每个声明器,初始化器可能是以下之一:

( 表达式列表 ) (1)

= 表达式 (2)

{ 初始化列表 } (3)

  1. 任意表达式的逗号分隔列表和括号中的花括号初始化列表

但在我的代码中

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))
  • 我认为这里的答案将是“有效语法不保证可以编译的代码

标签: c++ initialization


【解决方案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++ 书籍”,您会得到很多提供建议的人。
  • 它没有试图成为一个教程网站。它的目标受众是熟练工,而不是学徒。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-02-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-05-28
  • 2011-04-02
相关资源
最近更新 更多