簡體   English   中英

已刪除的析構函數是否會更改 C++ 中的聚合初始化?

[英]Does deleted destructor change aggregate initialization in C++?

代碼如下

struct B {
    ~B() = delete;
};

B * b = new B{};

無法在最新的 MSVC 中編譯並出現以下錯誤:

error C2512: 'B': no appropriate default constructor available
note: Invalid aggregate initialization

同時GCC和Clang都看不出代碼有什么問題,demo: https://gcc.godbolt.org/z/va

假設只是 MSVC 中的一個錯誤是否正確?

總的來說,析構函數的存在或刪除是否會改變聚合初始化的任何規則?

C++ 標准中聚合概念的定義都沒有提到析構函數。

例如,C++ 20 (9.4.2 Aggregates) 中聚合的定義聽起來如下

1 聚合是一個數組或一個 class(第 11 條)

(1.1) — 沒有用戶聲明或繼承的構造函數 (11.4.5),

(1.2) — 沒有私有或受保護的直接非靜態數據成員 (11.9),

(1.3) — 沒有虛函數 (11.7.3),和

(1.4) — 沒有虛擬、私有或受保護的基類 (11.7.2)。

如果在 MS VS 2019 中執行此語句

std::cout << std::is_aggregate_v<B> << '\n';

那么 output 將為1

另一方面,默認構造函數定義為已刪除(C++ 20 標准,11.4.5.2 默認構造函數)如果

(2.8) — 任何可能構造的子對象都具有帶有析構函數的類型,該析構函數已從默認的默認構造函數中刪除或不可訪問。

但是在提供的示例中沒有這樣的子對象。

所以它似乎是 MS VS 2019 的編譯器錯誤。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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