Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/130.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 为什么';带括号的初始值设定项列表的t构造函数/虚拟析构函数是否工作?_C++_Constructor_Virtual Destructor - Fatal编程技术网

C++ 为什么';带括号的初始值设定项列表的t构造函数/虚拟析构函数是否工作?

C++ 为什么';带括号的初始值设定项列表的t构造函数/虚拟析构函数是否工作?,c++,constructor,virtual-destructor,C++,Constructor,Virtual Destructor,为什么下面的代码不编译 #include <vector> class Foo { public: Foo() { } virtual ~Foo() { } std::vector<int> aVec; }; Foo bar = { { 1, 2, 3, 4, 5 } }; #包括 福班 { 公众: Foo() { } 虚拟~Foo() { } std::向量aVec; }; 富吧= { { 1, 2, 3, 4

为什么下面的代码不编译

#include <vector>

class Foo
{
public:
    Foo()
    { }

    virtual ~Foo()
    { }

    std::vector<int> aVec;
};


Foo bar =
{
    { 1, 2, 3, 4, 5 }
};
#包括
福班
{
公众:
Foo()
{ }
虚拟~Foo()
{ }
std::向量aVec;
};
富吧=
{
{ 1, 2, 3, 4, 5 }
};
在编译以下代码时:

#include <vector>

class Foo
{
public:

    /*Foo()
    { }

    virtual*/ ~Foo()
    { }

    std::vector<int> aVec;
};


Foo bar =
{
    { 1, 2, 3, 4, 5 }
};
#包括
福班
{
公众:
/*Foo()
{ }
虚拟*/~Foo()
{ }
std::向量aVec;
};
富吧=
{
{ 1, 2, 3, 4, 5 }
};
在提及语言规则的同时,请详细说明这些规则背后的理由


为什么构造函数和虚拟析构函数的存在会停止初始化?

因为
Foo
是类类型,因此括号内的init列表被视为一个类。除其他外,这要求类没有显式构造函数或虚拟成员:

聚合初始化是列表初始化的一种形式,它 初始化聚合。聚合是以下类型之一:

类类型(通常为struct或union),它具有

  • 没有私有或受保护的非静态数据成员

  • 没有用户提供、继承或显式(自C++17以来)构造函数(允许显式默认或删除的构造函数)

  • 没有虚拟基类、专用基类或受保护基类
  • 没有虚拟成员函数
  • 默认成员初始值设定项

您正在使用的列表初始化形式称为。它用于聚合类型。类型作为聚合的条件之一是它没有用户提供的构造函数


通过提供构造函数,编译器将尝试将列表初始化与定义的构造函数之一相匹配。它将更喜欢一个构造函数采取单一的。由于您没有提供参数,它将尝试查找与初始化列表提供的参数匹配的构造函数。由于唯一的构造函数是不带参数的默认构造函数,因此找不到匹配项。

foobar={{1,2,3,4,5}是。它仅为数组和“聚合”类类型定义。添加任何构造函数或虚拟成员意味着该类型不是聚合的。

当询问编译错误时,请包括编译器错误。是否尝试忽略类构造函数?