首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> C語言 >> C++ >> C++ 入門

合成默認構造函數被定義為delete的情況分析

     編輯:C++ 入門

合成默認構造函數被定義為delete的情況分析

C++ Primer第5版P450-451:編譯器合成的默認構造函數在某些情況下會被隱式定義為delete,導致類無法默認構造。

默認初始化規則回顧

  • 類類型:調用默認構造函數(需存在)
  • 內置類型:
    • 全局/靜態:零初始化
    • 局部:未定義值(但有默認值)
  • const內置類型:無法默認初始化,必須顯式提供初值

導致合成默認構造函數=delete的三種情況

  1. 含無類內初始值的const內置類型成員
    因const內置類型無默認值,編譯器無法為其生成初始化代碼
  2. 含無類內初始值的const類類型成員,且該類型無默認構造函數
    雙重限制:const要求初始化,類類型又無默認構造
  3. 含無類內初始值的類類型成員,且該類型無默認構造函數
    非const但類類型無默認構造,同樣無法默認初始化

代碼示例

// 情況1:const內置類型成員無類內初始值
struct A1 {
    const int ci;  // 錯誤:合成默認構造函數=delete
    // A1() = delete; 隱式
};

// 情況2:const類類型成員無默認構造
struct NoDefault { NoDefault(int); };
struct A2 {
    const NoDefault nd;  // 錯誤:nd無法默認初始化
};

// 情況3:類類型成員無默認構造
struct A3 {
    NoDefault nd;  // 錯誤:同樣無法默認初始化
};

解決方案

  • 為成員提供類內初始值:const int ci = 0; 或 NoDefault nd = NoDefault(42);
  • 為類類型定義默認構造函數
  • 為外層類自定義構造函數顯式初始化所有成員

關鍵區別總結

成員類型const有類內初始值類型有默認構造合成默認構造
內置類型否無關N/A正常
內置類型是無N/A=delete
內置類型是有N/A正常
類類型否無無=delete
類類型是無無=delete
類類型任意有/類型有默認構造任意正常

理解這機制對設計可正確構造的類至關重要,特別是涉及const成員與無默認構造類型組合時。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved