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

含const成员变量的C++类为何仍能执行对象拷贝?

为什么带const成员的类实例可以被拷贝?

你误解了cppreference文档里"无法拷贝的非静态数据成员"的定义——const int类型的成员并不是"无法拷贝"的。

cppreference里说的"无法拷贝",指的是该成员的拷贝构造函数被删除、不可访问(比如private且无访问权限),或者存在歧义(比如多个重载拷贝构造函数导致编译器无法选择)。而const int本质还是int类型,它的拷贝完全合法:拷贝时只是把obj1.val的值(100)复制给obj2.val,只是obj2.val同样带有const属性、不能被修改,但拷贝操作本身没有任何问题。

你的Demo类中,编译器会生成默认拷贝构造函数,它会逐个拷贝所有非静态成员。因为const int val可以被正常拷贝,所以默认拷贝构造函数不会被删除,Demo obj2(obj1)能正常执行。

如果要触发cppreference描述的"拷贝构造函数被删除"的情况,需要使用真正无法拷贝的成员,比如:

#include <iostream>
using namespace std;

class NoCopy {
public:
    NoCopy() = default;
    // 显式删除拷贝构造函数
    NoCopy(const NoCopy&) = delete;
};

class Demo {
public:
    const int val = 100;
    NoCopy nc; // 该成员无法拷贝
    Demo(){}    
};

int main() {
    Demo obj1;
    Demo obj2(obj1); // 编译错误:Demo的拷贝构造函数被删除
    return 0;
}

这段代码里,NoCopy类的拷贝构造被删除,导致Demo类的默认拷贝构造函数也被删除,此时尝试拷贝obj1就会编译失败,这才符合cppreference里的场景。

内容的提问来源于stack exchange,提问作者Mangy

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.03 22:50:29