bin*_*aba 2 c++ constructor virtual-destructor
为什么以下代码不编译?
#include <vector>
class Foo
{
public:
Foo()
{ }
virtual ~Foo()
{ }
std::vector<int> aVec;
};
Foo bar =
{
{ 1, 2, 3, 4, 5 }
};
Run Code Online (Sandbox Code Playgroud)
以下代码编译时:
#include <vector>
class Foo
{
public:
/*Foo()
{ }
virtual*/ ~Foo()
{ }
std::vector<int> aVec;
};
Foo bar =
{
{ 1, 2, 3, 4, 5 }
};
Run Code Online (Sandbox Code Playgroud)
除了参考语言规则外,请详细说明这些规则背后的基本原理.
为什么构造函数和虚拟析构函数的存在会因初始化而停止?
您正在使用的列表初始化形式称为聚合初始化.它用于聚合类型.类型作为聚合的类型的要求之一是它没有用户提供的构造函数.
通过提供构造函数,编译器将尝试将列表初始化与定义的构造函数之一进行匹配.它更喜欢一个构造函数std::initializer_list
.由于您没有提供一个,它将尝试查找与您的初始化列表提供的参数匹配的构造函数.由于唯一的构造函数是不带参数的默认构造函数,因此找不到匹配项.