什么是C++中的std::Expect? [英] What is std::expected in C++?

查看:36
本文介绍了什么是C++中的std::Expect?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

在最受尊敬的堆栈溢出答案之一中,我找到了std::expected模板类用法的一个示例: What are coroutines in C++20?

同时,我在cpprecie.com上找不到任何提到这个类的内容。你能解释一下是什么吗?

推荐答案

事实上,了解std::expected的最好方式是著名的Andrei Alexandresu的一次有趣的演讲:"Expect the Expected!"

它是什么以及何时使用

以下是关于std::expected<T, E>是什么的三个补充说明:

  • 它是应该返回T值的函数的返回类型--但可能会遇到一些错误,在这种情况下,它将返回E类型的该错误的描述符。示例:

    std::expected<ParsedData, ParsingError> parse_input(Input input_);
    
  • 它是一种错误处理机制,可以替代抛出异常(在这种情况下,您总是返回您应该返回的值)和返回状态/错误代码(在这种情况下,您永远不会返回您想要返回的值,并且必须使用输出参数)。以下是应用于上一个定义中的函数的两种替代错误处理机制:

    ParsedData    parse_input_2(Input input) noexcept(false);
    ParsingError  parse_input_3(ParsedData& result, Input input);
    
  • 它是TE的区别并,使用了一些方便的方法。

有什么比std::variant<T,E>更好的地方吗?

它的行为有点像std::optional<T>,将焦点放在预期的情况,而不是意外的情况:

  • result.has_value()-如果我们得到一个值而不是错误,则为True。
  • if (result)-检查相同的内容
  • *result-如果T存在,则提供T值,否则提供未定义的行为(与std::optional相同,尽管许多人不喜欢这样)。
  • result.value(),如果T值存在,则返回该值,否则抛出。
实际上,最后一种访问模式与收到错误时的行为不同:它抛出的是带有返回错误的。可以将此行为视为从基于预期的错误处理切换到基于异常的错误处理的一种方式。

&q;嘿,我在标准中寻找它,但它不在那里!

没错,在撰写本文时,std::expected是一个用词不当的词。它还没有被标准化,只是提出:P0323。不过,它看起来可能会进入C++23。

这就是说-它已经非常有用了,因为它不需要新的语言工具。我推荐Sy Brand(Tartanllama)的implementation,它可以在C++11或更高版本上使用。它还有一些巧妙的函数式扩展(可能不是标准化的)。

但协程又如何呢?

std::expected和协程之间没有特殊关系。你链接到的答案似乎使用了类似的东西。它还使用std::unexpected。这实际上是在标准中,但从C++11开始就被弃用了,请立即忘记它:-(

这篇关于什么是C++中的std::Expect?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆