C++编译报错use of deleted function std::variant()问题求助
报错原因分析
- 构造函数初始化逻辑错误
C++ 类的成员变量会在进入构造函数体之前完成初始化,你当前写的Document(StateVariant &&a_state)没有在初始化列表中对m_state进行初始化,编译器会先尝试调用std::variant的默认构造函数初始化m_state,之后再在函数体内执行移动赋值操作。但此时std::variant的默认构造函数已被删除,直接触发编译错误。 - std::variant 默认构造函数被隐式删除
std::variant的默认构造函数仅当第一个备选类型可以无歧义默认构造时才会自动生成。你的DraftState类同时定义了两个可无参调用的构造函数:DraftState() = default和带默认参数的DraftState(const std::string &a_rMsg = ""),无参构造DraftState时会产生调用歧义,因此std::variant判定第一个备选类型无法默认构造,将自身的默认构造函数隐式删除。 - 构造函数参数不匹配调用场景
你定义的Document(StateVariant &&a_state)接收的是右值引用,但main函数中传入的draftState是左值,无法直接绑定到右值引用上,即使解决了默认构造的问题,这个调用也会触发类型匹配错误。
修复方案
- 修复
DraftState的构造歧义,删除冗余的默认构造声明即可,带默认参数的构造函数已经可以承担无参构造的功能:
// 删除这行即可 // DraftState() = default;
- 将
Document的构造逻辑移到初始化列表,避免触发std::variant的默认构造:
Document(StateVariant &&a_state) : m_state(std::move(a_state)) {}
- 适配左值传入的场景,二选一即可:
- 给
Document增加左值引用版本的构造函数:
Document(const StateVariant& a_state) : m_state(a_state) {}- 或者在
main函数调用时将左值转为右值:
Document<State> doc(std::move(draftState)); - 给
如果你的业务场景不需要使用Document的无参构造,也可以直接删除Document() = default;声明,彻底避免依赖std::variant的默认构造函数。
内容的提问来源于stack exchange,提问作者Coder909
相关产品推荐
相关产品推荐

