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

如何创建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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.13 20:44:55