簡體   English   中英

為什么帶有支撐初始化列表的Constructor / virtual析構函數不起作用?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM