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}代码>是。它仅为数组和“聚合”类类型定义。添加任何构造函数或虚拟成员意味着该类型不是聚合的。当询问编译错误时,请包括编译器错误。是否尝试忽略类构造函数?