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

std::unique_ptr结构体使用初始化列表赋值时调用已删除函数报错

问题触发原因

RenderableAtmosphere结构体包含std::unique_ptr成员,该智能指针本身禁止拷贝,因此编译器会隐式删除RenderableAtmosphere的拷贝构造函数,这个类型属于仅可移动类型,只能执行移动构造、移动赋值,不能拷贝。
你编译失败的核心原因是使用了std::initializer_list(花括号初始化语法)构造临时vector:
std::initializer_list的底层是一段存储元素的临时数组,数组内所有元素默认都是const左值,哪怕你往初始化列表里传入std::move生成的右值,存入initializer_list后也会变成不可修改的const对象。vector从initializer_list构造时,只能读取这些const元素,只能触发拷贝构造,无法执行移动操作(移动需要修改原对象,const对象不允许修改),因此调用了已删除的拷贝构造函数,编译报错。

push_back正常编译的原因

std::vector的push_back方法有专门的右值引用重载:void push_back(T&& value),你传入std::move(renderableUranusAtmosphere)生成的右值时,会直接匹配到这个重载,调用RenderableAtmosphere的默认移动构造函数完成元素插入,全程不需要拷贝操作,因此编译正常。

修复方案

如果要给vector赋值仅可移动类型的元素,避免使用initializer_list构造即可,推荐写法:

uranusSystemComponent.atmospheres.clear();
uranusSystemComponent.atmospheres.reserve(1);
uranusSystemComponent.atmospheres.push_back(std::move(renderableUranusAtmosphere));

如果需要一次性插入多个元素,依次调用push_back/emplace_back即可,可读性和兼容性都最优。


内容的提问来源于stack exchange,提问作者Глеб Труфанов

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.08 23:30:03