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