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

