关于C++结构体F默认构造函数被隐式删除的疑问
嘿,我来帮你把这个问题掰扯清楚~
为什么结构体
F的默认构造函数会被标记为删除? 先把你的结构体定义贴出来方便对照:
struct F { int& ref; // 引用成员 const int c; // const成员 // F::F() 被隐式定义为删除状态 };
C++里编译器自动生成的默认构造函数(无参构造)有个核心规则:如果类/结构体里存在必须在构造阶段明确初始化的成员,编译器就会把默认构造函数标记为删除,避免生成会导致未定义行为的代码。具体到你的F结构体,两个成员都属于这类“必须初始化”的情况:
- 引用成员
ref:C++规定引用从创建的那一刻起,就必须绑定到一个有效的对象,绝对不能“悬空”或者做默认初始化。默认构造函数没办法凭空给它找一个合法的绑定对象,所以编译器干脆直接禁用这个默认构造。 - const成员
c:const类型的成员一旦创建就无法修改,所以必须在对象构造的同时给它赋值。默认构造函数没办法给它提供一个确定的合法初始值(总不能随便塞个内存垃圾值吧?),这也会导致默认构造被删除。
那如果想正常创建F的实例怎么办?你需要自己手动定义构造函数,明确给这两个成员做初始化:
struct F { int& ref; const int c; // 自定义构造函数,通过初始化列表完成成员初始化 F(int& target_ref, int const_val) : ref(target_ref), c(const_val) {} }; // 现在就能正常使用了: int num = 100; F my_f(num, 200); // ref绑定到num,c被初始化为200
简单总结:默认构造函数的作用是给所有成员做默认初始化,但引用和const成员根本不支持“默认初始化”——前者必须绑对象,后者必须一开始就赋值,所以编译器只能把默认构造删掉,防止你写出有问题的代码。
内容的提问来源于stack exchange,提问作者Cantaff0rd
相关产品推荐
相关产品推荐

