std::expected是C++23引入的用于表示可能成功或失败操作的模板类,它包含预期值T或错误E,提供比异常更清晰、类型安全且无性能开销的错误处理方式,适用于可预期错误场景。C++23 引入了 std::expected,它是一种用于表示可能成功或失败操作的类型,提供了一种比传统异常更清晰、更可控的错误处理方式。它本质上是一个“预期值”容器:要么包含预期的结果(值),要么包含一个错误信息。
std::expected
与 std::optional
虽然异常是 C++ 中传统的错误处理机制,但它们存在一些问题,而 std::expected 提供了更优的替代方案:
假设我们写一个除法函数,可能因除零失败:
#include#include std::expected divide(double a, double b) { if (b == 0.0) { return std::unexpected("Division by zero"); } return a / b; } // 使用 auto result = divide(10, 2); if (result) { std::cout << "Result: " << *result << "\n"; } else { std::cout << "Error: " < < result.error() << "\n"; }
这里错误类型用了 std::string,实际项目中建议使用 enum class 或 std::error_code 以提高效率和类型安全。
当然,异常仍有其用途,比如资源分配失败、严重不可恢复错误等。std::expected 并非要完全取代异常,而是为“可预期的错误”提供了更好的选择。
基本上就这些。std::expected 让错误处理变得更像数据处理,逻辑清晰,控制力强,是现代 C++ 发展的重要一步。