如何返回可选的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
相关产品推荐
相关产品推荐

