std::expected是C++23引入的用于安全处理可能失败操作的模板类,它封装成功值或错误信息,提供类型安全、显式错误处理,避免异常开销,适用于嵌入式与高可靠性场景。

在C++23中,std::expected 被正式引入作为标准库的一部分,用于更安全、更清晰地处理可能失败的操作。它提供了一种类型安全的方式来表示一个值或一个错误,取代传统的异常抛出或返回错误码的方式,尤其适合在不希望使用异常的项目中进行可靠错误处理。
std::expected<T, E> 是一个模板类,表示要么包含一个类型为 T 的期望值(成功情况),要么包含一个类型为 E 的错误信息(失败情况)。这类似于函数式语言中的 Result 类型,也与 std::optional 类似,但能携带具体的错误原因,而不仅仅是“有值”或“无值”。
相比以下方式:
std::expected 提供了更现代、更安全的替代方案。
立即学习“C++免费学习笔记(深入)”;
下面是一个使用 std::expected 实现整数除法的简单例子:
#include <expected>
#include <iostream>
#include <string>
<p>std::expected<int, std::string> divide(int a, int b) {
if (b == 0) {
return std::unexpected("除数不能为零");
}
return a / b;
}</p><p>int main() {
auto result = divide(10, 2);
if (result.has_value()) {
std::cout << "结果: " << result.value() << "\n";
} else {
std::cout << "错误: " << result.error() << "\n";
}</p><pre class='brush:php;toolbar:false;'>auto bad_result = divide(10, 0);
if (!bad_result) {
std::cout << "错误: " << bad_result.error() << "\n";
}}
在这个例子中:
选择合适的错误类型 E 很重要。常见做法包括:
例如:
enum class ParseError {
InvalidSyntax,
Overflow
};
<p>std::expected<int, ParseError> parse_int(const std::string& str) {
// ... 解析逻辑
if (/<em> 格式错误 </em>/) {
return std::unexpected(ParseError::InvalidSyntax);
}
if (/<em> 溢出 </em>/) {
return std::unexpected(ParseError::Overflow);
}
return parsed_value;
}</p>虽然当前标准尚未提供像 .and_then() 或 .or_else() 这样的函数式组合方法(预计后续标准加入),但你可以手动实现简洁的链式调用:
auto result = compute_a(); if (!result) return result; <p>auto next = compute_b(result.value()); if (!next) return std::unexpected(next.error());</p><p>return next;</p>
std::expected 并非要完全取代异常,而是提供另一种选择:
它的优势在于:
基本上就这些。std::expected 让 C++ 的错误处理更加现代化和安全,特别适合系统编程、库开发和高可靠性场景。
以上就是c++++怎么使用C++23的std::expected进行错误处理_C++23新特性与安全错误处理的详细内容,更多请关注php中文网其它相关文章!
c++怎么学习?c++怎么入门?c++在哪学?c++怎么学才快?不用担心,这里为大家提供了c++速学教程(入门到精通),有需要的小伙伴保存下载就能学习啦!
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号