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

关于cppreference中隐式拷贝构造函数废弃规则的疑问

关于用户定义析构函数时隐式拷贝构造函数的疑问解答

首先明确:cppreference的描述是正确的,你混淆了**弃用(deprecated)和删除(deleted)**的概念,这是问题的核心。

核心规则区分

The generation of the implicitly-defined copy constructor is deprecated if T has a user-defined destructor

这句话的意思是:当类T拥有用户定义的析构函数时,隐式生成的拷贝构造函数会被标记为弃用,而非直接被删除。两者的关键区别:

  • 删除(deleted):该函数被编译器禁用,代码尝试使用时直接编译报错(就像你的测试用例2的情况)。
  • 弃用(deprecated):函数仍然可以正常使用,但属于标准不推荐的特性,编译器会发出警告(需要开启对应编译选项,比如-Wdeprecated或-Wall),未来的C++标准可能会彻底移除该特性。

你的测试用例3的解释

当你仅定义析构函数时,编译器仍然会为类隐式生成拷贝构造函数,只是这个生成的函数被标记为弃用。所以你的代码可以正常编译运行,但如果开启了警告选项,会看到类似这样的提示:

warning: implicitly-declared 'constexpr T::T(const T&)' is deprecated because T has a user-declared destructor [-Wdeprecated-copy]

补充说明

C++标准做出这个弃用规则的原因是:当类需要用户定义析构函数时,通常意味着类管理了资源(比如动态内存、文件句柄等),此时隐式生成的拷贝构造函数只会做浅拷贝,很可能导致资源重复释放等问题,所以标准不推荐依赖这种隐式生成的拷贝构造函数,建议显式定义拷贝构造函数(或标记为删除)来明确类的拷贝语义。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.10 20:39:51