[英]C++ initialization strange behavior
typedef struct node {
int val;
int val2;
node(int a, int b) : val(a), val2(b) {}
node(int val) = delete;
}node;
int main()
{
node a = {3};
cout << a.val << " " << a.val2 << endl;
return 0;
}
上面的代碼給出了編譯錯誤,表明使用了刪除的函數node::node(int)
。
但是,當我刪除node(int a, int b) : a(val), b(val2) {}
,此代碼編譯沒有問題。 這怎么會發生?
在 C++20 之前, 聚合類型允許顯式刪除的構造函數。 如果刪除node(int a, int b)
並保留node(int val) = delete;
只有, node
被視為聚合和node a = {3};
執行聚合初始化,不會使用構造函數,因為效果a.val
初始化為3
, a.val2
直接初始化為0
。
沒有用戶提供的構造函數(允許顯式默認或刪除的構造函數)(從 C++11 開始)(直到 C++17)
沒有用戶提供的、繼承的或顯式的構造函數(允許顯式默認或刪除的構造函數)(自 C++17 起)(直到 C++20)
C++20 已修復此行為。 node a = {3};
執行 列表初始化,刪除的構造函數將被使用並且代碼格式錯誤。
沒有用戶聲明或繼承的構造函數 (C++20 起)
BTW: typedef
在node
的定義中的用法是多余的,你可以把它寫成struct node { ... };
.
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.