簡體   English   中英

C++ 初始化奇怪的行為

[英]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初始化為3a.val2直接初始化為0

沒有用戶提供的構造函數(允許顯式默認或刪除的構造函數)(從 C++11 開始)(直到 C++17)

沒有用戶提供的、繼承的或顯式的構造函數(允許顯式默認或刪除的構造函數)(自 C++17 起)(直到 C++20)

C++20 已修復此行為。 node a = {3}; 執行 列表初始化,刪除的構造函數將被使用並且代碼格式錯誤。

沒有用戶聲明或繼承的構造函數 (C++20 起)

BTW: typedefnode的定義中的用法是多余的,你可以把它寫成struct node { ... }; .

暫無
暫無

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

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