含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
相关产品推荐
相关产品推荐

