You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

为何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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.29 18:22:09