如何创建std::expected<void, void>?解决unexpected<void>编译失败问题
如何让std::expected<void, void>返回失败状态?
你碰到的情况是:用std::expected<void, void>时,返回std::unexpected<void>()会编译失败,但类似的std::expected<void, int>代码却能正常运行。这是因为GCC-14的实现中,std::unexpected<void>没有可用的默认构造函数,而std::unexpected<int>可以通过传入参数完成构造。
下面是两种可行的解决方法:
方法1:用聚合初始化构造std::unexpected
std::unexpected<void>属于聚合类型,可以直接用{}初始化,绕过默认构造函数的限制。修改后的代码如下:
#include <expected> [[nodiscard]] std::expected<void, void> do_logic() { return std::unexpected<void>{}; }
还可以利用模板推导简化写法:
return std::unexpected{};
方法2:直接构造失败状态的std::expected
也可以直接构造std::expected<void, void>的失败实例,不需要单独创建std::unexpected对象:
#include <expected> [[nodiscard]] std::expected<void, void> do_logic() { return std::expected<void, void>(std::unexpected<void>{}); }
修改后,你的预期使用场景可以正常工作:
const auto result = do_logic(); if(result.has_value()) { // success case } else { // error case }
内容的提问来源于stack exchange,提问作者user2138149
相关产品推荐
相关产品推荐

