[英]Why doesn't Constructor/virtual destructor with braced initializer list work?
為什么以下代碼不編譯?
#include <vector>
class Foo
{
public:
Foo()
{ }
virtual ~Foo()
{ }
std::vector<int> aVec;
};
Foo bar =
{
{ 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
是類類型,所以支撐的初始化列表被視為聚合初始化 。 除其他外,這需要該類沒有顯式構造函數或虛擬成員:
聚合初始化是列表初始化的一種形式,它初始化聚合。 聚合是以下類型之一:
類類型(通常是struct或union),有......
沒有私有或受保護的非靜態數據成員
沒有用戶提供,繼承或顯式(自C ++ 17)構造函數(允許顯式默認或刪除構造函數)
- 沒有虛擬,私有或受保護的基類
- 沒有虛擬成員功能
- 默認成員初始化程序
您正在使用的列表初始化形式稱為聚合初始化 。 它用於聚合類型。 類型作為聚合的類型的要求之一是它沒有用戶提供的構造函數。
通過提供構造函數,編譯器將嘗試將列表初始化與定義的構造函數之一進行匹配。 它更喜歡構造函數采用單個std::initializer_list
。 由於您沒有提供一個,它將嘗試查找與您的初始化列表提供的參數匹配的構造函數。 由於唯一的構造函數是不帶參數的默認構造函數,因此找不到匹配項。
Foo bar = { { 1, 2, 3, 4, 5 } };
是聚合初始化 。 它僅為數組和“聚合”類類型定義。 添加任何構造函數或虛擬成員意味着該類型不是聚合的。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.