0Pricing
C++ Academy · 课时

std::expected 基础

返回值或错误

std::expected 基础 是 CoddyKit 上的免费 C++ Academy 课时。 这是第 3 节课,共 4 节。 你可以在下方免费阅读本课时的完整内容 — 然后在浏览器中使用内置代码编辑器和全天候 AI 导师进行实践。 这是 C++ Academy 学习路径的一部分,你的进度在网页和 CoddyKit 应用中同步。 C++ Academy 课程共包含 4 节课。

值或错误

std::expected<T, E>(C++23)保存类型 T 的成功值或类型 E 的错误。与 optional 不同,它还携带失败的原因。请包含 <expected>。

返回成功结果

成功时直接返回该值;它会作为“预期”类型 T 保存。

#include <expected>
#include <iostream>
std::expected<int, std::string> parse(bool ok) {
    if (ok) return 100;
    return std::unexpected("bad input");
}
int main() {
    auto r = parse(true);
    if (r) std::cout << *r << "\n";
}

返回错误

请将错误包装在 std::unexpected(...) 中,以表示失败,同时仍然返回相同的类型。

#include <expected>
#include <iostream>
#include <string>
std::expected<int, std::string> div(int a, int b) {
    if (b == 0) return std::unexpected("divide by zero");
    return a / b;
}
int main() {
    auto r = div(8, 0);
    if (!r) std::cout << r.error() << "\n";
}

检查是否成功

请在布尔上下文中检查结果,或使用 has_value()。true 表示其中保存的是值,false 表示其中保存的是错误。

#include <expected>
#include <iostream>
int main() {
    std::expected<int, int> r = 5;
    std::cout << r.has_value() << "\n"; // 1
}

读取值

请使用 *r 或 r.value() 读取成功值。如果其中实际保存的是错误,value() 会抛出 std::bad_expected_access。

#include <expected>
#include <iostream>
int main() {
    std::expected<int, std::string> r = 7;
    if (r) std::cout << r.value() << "\n";
}

读取错误

当结果处于错误状态时,r.error() 会为您提供错误对象。

#include <expected>
#include <iostream>
#include <string>
std::expected<int, std::string> f() { return std::unexpected("nope"); }
int main() {
    auto r = f();
    if (!r) std::cout << "error: " << r.error() << "\n";
}

value_or 回退值

与 optional 一样,value_or(fallback) 会返回成功值或默认值,而无需检查错误。

#include <expected>
#include <iostream>
std::expected<int, std::string> f() { return std::unexpected("x"); }
int main() {
    std::cout << f().value_or(0) << "\n"; // 0
}

Optional 与 Expected 的比较

std::optional 表示“有值或什么都没有”;std::expected 表示“有值或有明确说明的错误”。当调用方需要知道失败原因时,请选择 expected。

丰富的错误类型

错误类型 E 可以是枚举、结构体或消息字符串,具体取决于哪种形式最能描述您所在领域中的失败情况。

#include <expected>
#include <iostream>
enum class Err { NotFound, Denied };
std::expected<int, Err> get(bool ok) {
    if (ok) return 1;
    return std::unexpected(Err::Denied);
}
int main() {
    auto r = get(false);
    if (!r) std::cout << (int)r.error() << "\n";
}

无需异常

std::expected 允许您将失败作为普通返回值进行传递,这在禁用异常或异常开销较高的场景中很有用。

可用性说明

std::expected 是 C++23 的特性;使用前,请确保您的编译器和标准选项(例如 -std=c++23)支持它。

快速检查

检查您对 std::expected 的理解。

回顾

您学习了 std::expected:

  • 保存一个值(T)或一个错误(E)。
  • 直接返回成功结果,通过 std::unexpected 返回错误。
  • 使用 */value() 读取值,使用 error() 读取错误。
  • 携带失败原因,而 optional 不会携带。

常见问题解答

「std::expected 基础」课时是免费的吗?

是的 — 「std::expected 基础」的完整文本可在网页上免费阅读。要进行交互式练习(内置代码编辑器和全天候 AI 导师)并解锁 C++ Academy 课程的其余内容,请升级到 CoddyKit PRO。 C++ Academy 课程共包含 4 节课。

「std::expected 基础」这节课中我会学到什么?

返回值或错误 你通过在浏览器中直接运行的动手代码来练习 C++ Academy,全天候 AI 导师会在你学习这节课的过程中回答你的问题。

学习 C++ Academy 需要有经验吗?

无需任何先前经验。CoddyKit 上的 C++ Academy 课程适合初学者到高级学习者,你可以从这里开始或从头开始,按照自己的节奏学习。 这是第 3 节课,共 4 节。

「std::expected 基础」课时需要多长时间?

大多数 CoddyKit 课程大约需要 5–10 分钟。每节课都很精短且互动,所以你能稳步进步,并在网页和应用中从离开的地方继续。

我能在这节 C++ Academy 课中编写并运行代码吗?

能。每节 C++ Academy 课都包含内置代码编辑器,你可以在浏览器中直接编写并运行真实代码,并获得即时 AI 反馈 — 无需本地设置。

此课程中的所有课时

  1. 使用 optional 表示缺失值
  2. 访问 optional 值
  3. std::expected 基础
  4. 错误处理模式
← 返回 C++ Academy