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

C++结构体含unique_ptr成员时递归转字符串报拷贝构造函数删除错误

错误原因

报错和你写的*(n.left)操作没有直接关系,核心问题出在函数参数定义上:

  • std::unique_ptr是独占所有权的智能指针,它本身禁用了拷贝构造和拷贝赋值,不允许多个unique_ptr指向同一块内存。
  • 根据C++类的隐式成员生成规则:如果类的非静态成员存在不可拷贝的类型,编译器自动为类生成的拷贝构造函数会被直接标记为删除。你的node结构体包含两个std::unique_ptr<node>类型的成员,因此node的隐式拷贝构造函数本身就是被删除的状态。
  • 你写的std::string node_to_string(node n)用了值传参,调用函数时会尝试把传入的node对象拷贝一份给形参n,这一步就会调用被删除的node拷贝构造函数,直接触发编译错误。
疑惑点解释

你之前操作std::unique_ptr<node>类型的参数时,执行*n操作只是拿到该智能指针指向的原对象的引用,没有触发整个node对象的拷贝,自然不会报错。你现在代码里的*(n.left)本身是合法操作,只是编译器在检查函数调用的传参合法性阶段就已经抛出错误,还没走到递归调用那一步的语义检查。

修复方法

把值传参改成const引用传参即可,做字符串转换不需要修改原对象,也不需要拷贝对象:

// 参数改为const node&,引用传参不会触发拷贝
std::string node_to_string(const node& n) {
    std::string result = "<other members converted to strings>";
    // 递归前必须判空,避免空指针解引用导致程序崩溃
    if (n.left) {
        result += node_to_string(*n.left);
    }
    if (n.right) {
        result += node_to_string(*n.right);
    }
    return result;
}

修改后递归调用时传入的*n.left会直接绑定到const引用形参上,全程没有任何对象拷贝操作,符合unique_ptr的所有权规则,编译可以正常通过。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.28 18:36:51