是否有与引用返回函数等效的“返回 NULL”?

KJ7*_*LNW 3 c++ reference return-value return-by-reference

我正在使用返回引用的现有代码,如下所示:

int &func()
{
   static int i = 5;
   return i;
}
Run Code Online (Sandbox Code Playgroud)

我想将错误情况返回为“NULL”,但当然 NULL 在按引用返回函数中不起作用。如果这返回一个指针我可能会这样做:

int *func()
{
   static int i = 5;

   if (!good)
       return NULL;
   else
       return &i;
}
Run Code Online (Sandbox Code Playgroud)

除了转换为基于指针的返回值之外,是否有返回失败状态的最佳实践?

Ahm*_*AEK 6

是的,c ++ 17引入了std::可选,它可以为空,但它不能有引用,所以std::optional<<std::reference_wrapper<int>>是正确的“标准”返回。

std::optional<<std::reference_wrapper<int>> func()
{

   static int i = 5;

   if (!good)
       return std::nullopt;  // return {}; works here
   else
       return i;
}
Run Code Online (Sandbox Code Playgroud)

后来c++20引入了std::expected,它也可以返回一个信号Error Type来表示更多信息,而不仅仅是“失败”。

即使您使用旧的 C++ 标准,您仍然可以在 C++11 库中使用可选,与C++11 库中的预期相同。


c++11 可选库可以保存引用,因此您可以使用它来获得更清晰的代码。

tl::optional<int&> func()
{

   static int i = 5;

   if (!good)
       return tl::nullopt;  // return {}; works here
   else
       return i;
}
Run Code Online (Sandbox Code Playgroud)