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

如何返回可选的Boost::JSON对象?代码抛出bad_optional_access异常

问题解决:Boost Optional JSON对象抛出boost::bad_optional_access异常

错误根源

你的代码中,res.json是boost::optional<boost::json::object>类型,默认构造时处于**未初始化(空)**状态。此时直接调用value()访问内部对象会触发boost::bad_optional_access异常——这就是运行时崩溃的核心原因。

修复方案

以下是几种可行的修复方式:

方案1:直接给optional赋值(推荐)

直接将构造好的boost::json::object赋值给res.json,boost::optional会自动完成内部对象的初始化,结合std::move还能避免不必要的拷贝:

Response func() {
    Response res;
    boost::json::object json;
    json["test"] = "func";
    res.json = std::move(json);
    return res;
}

也可以简化为直接构造对象赋值:

Response func() {
    Response res;
    res.json = boost::json::object{{"test", "func"}};
    return res;
}

方案2:用emplace初始化内部对象

如果想在optional内部直接构造对象,避免额外的移动/拷贝操作,可以先调用emplace()激活optional,再安全访问内部对象:

Response func() {
    Response res;
    res.json.emplace(); // 初始化内部的json::object实例
    res.json.value()["test"] = "func"; // 此时调用value()是安全的
    return res;
}

关于std::move的说明

你提到不加std::move代码无法编译,这是因为boost::json::object的拷贝构造函数被禁用(或标记为删除),只能通过移动语义传递对象。使用std::move可以将对象所有权转移给optional内部的实例,是合理且高效的用法。

内容的提问来源于stack exchange,提问作者Existn't

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.01 14:22:27