为何C++允许用PSModel引用初始化PSModel成员变量而不报错?
问题解答
你的代码场景可以简化为类似这样的结构:
class PSModel { // 类成员定义 }; class PSTemperatureMonitor { private: PSModel model; // 遗漏了&符号,原本想声明为PSModel& public: PSTemperatureMonitor(PSModel& param) : model(param) {} };
编译器不报错的核心原因是这里不存在类型不匹配,完全符合C++的语法规则:
- 构造函数的参数
param是PSModel&,它本质是一个PSModel对象的别名。 - 成员变量
model是PSModel值类型,初始化时会调用PSModel的拷贝构造函数(如果没有显式定义,编译器会自动生成默认的拷贝构造函数),把param指向的原对象完整拷贝一份,赋值给model成员。 - 引用类型可以隐式用于初始化对应的值类型对象(通过拷贝),这是语言允许的合法操作,所以编译器不会抛出类型不匹配的错误。
如果想避免这类“意外拷贝”的问题,可以给PSModel显式删除拷贝构造函数(C++11及以上支持),这样当你试图通过引用拷贝初始化值类型成员时,编译器就会直接报错,帮你快速发现遗漏&的问题:
class PSModel { public: PSModel(const PSModel&) = delete; // 禁用拷贝构造 // 其他成员定义 };
内容的提问来源于stack exchange,提问作者Greycon
相关产品推荐
相关产品推荐

