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

为何make_unique<DbCell<ChapterMap>>编译失败而unique_ptr直接new正常

问题解答

1. cmp4编译失败的原因

你对std::make_unique的用法存在误解,你之前认为等价的两种写法实际对应的场景不同:

  • 对于无参构造的场景,正确的等价写法是:
    make_unique<T>() 等价于 unique_ptr<T>(new T())
    

make_unique<T>的参数是用来传递给T类型的构造函数的,而不是直接接收new返回的指针交给unique_ptr接管。你写的cmp4代码:

make_unique<DbCell<ChapterMap>>(new DbCell<ChapterMap>())

相当于向DbCell<ChapterMap>的构造函数传入了一个DbCell<ChapterMap>*类型的指针,而你的DbCell类没有任何接收指针类型参数的构造函数,自然匹配失败触发编译错误。
如果要写和cmp3等价的make_unique版本,直接写无参调用即可:

unique_ptr<DbCell<ChapterMap>> cmp4 = make_unique<DbCell<ChapterMap>>();

2. 拷贝构造函数被隐式删除的原因

C++类的默认拷贝构造函数生成规则是:如果类的非静态成员存在拷贝构造被删除、不可访问的情况,那么该类的默认拷贝构造函数会被编译器隐式定义为删除。
你的DbCell类包含一个T value_成员,当模板参数T为ChapterMap时,ChapterMap的拷贝构造函数已经被你显式=delete,所以DbCell<ChapterMap>的默认拷贝构造无法生成,被隐式删除。
你自己只定义了无参构造、接收const T&的构造、接收T&&的构造,没有显式定义拷贝构造函数,所以编译器会尝试生成默认版本,失败后就会触发该提示。

额外说明:你当前定义的DbCell(const T& v) : value_(v.value_)逻辑存在问题,当T为ChapterMap时,ChapterMap并没有value_成员,当前报错是先触发了参数匹配问题,还没到检查该逻辑的阶段。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.06 11:51:01