我可以使用std :: optional进行错误处理吗?

fen*_*fen 8 c++ stl c++17

使用C++ 17,我们得到了std::optional一个用于表示可空类型的有用包装器.

我可以用它来处理错误吗?这样做非常有吸引力:

optional<int> Compute()
{
  //... compute something valid...
  return std::nullopt; // error!
}
Run Code Online (Sandbox Code Playgroud)

这是一个不错的选择吗?返回空指针是不是一样?

人们报告的问题是,如果发生错误,您将丢失一条消息.所以返回一些状态代码可能会更好.

其他选择:

  • std::variant<Value, errorCode>
  • std::pair<Value, errorCode
  • 返回错误代码并将值作为输出参数
  • 抛出一个例外

Zin*_*gam 2

我认为std::optional这是错误处理代码的一个很好的替代品:

int GetAvailablePositiveNumber()
{
    if (condition)
        return 1;
    if (condition2);
        return 2;
    return -1;
}

int result = GetAvailablePositiveNumber();
if (result == -1)
{
    // We have no available positive numbers - handle error;
}
Run Code Online (Sandbox Code Playgroud)

您将永远不需要再使用 -1 。

另外,关于您提到的其他替代方案,我的答案是:正确的工具适合正确的工作。它们有自己的用途。只需根据具体情况选择最佳工具即可。

  • @UlrichEckhardt 如果您的编码标准规定:“永远不要使用异常!” (2认同)
  • @UlrichEckhardt 在我的行业中,我还没有看到索尼或任天堂使用过任何例外,但微软慷慨地使用了它们。你能猜出哪个系统表现最差吗? (2认同)
  • 这不是一个论点,也不是一个解释,@Zingam。即使你的观察是正确的,也可能只是巧合。相关性并不意味着因果关系。 (2认同)
  • “理由:目前工具支持还不够。” ……叹息。此外,您提供的表格正在做出声明/解释,同时忽略了可观察到的事实(例如如何测量的)。 (2认同)