I'm working with existing code that returns a reference, something like this:
int &func()
{
static int i = 5;
return i;
}
I would like to return an error case as "NULL" but of course NULL doesn't work in a return-by-reference function. If this were returning a pointer I might do this:
int *func()
{
static int i = 5;
if (!good)
return NULL;
else
return &i;
}
Besides converting to a pointer-based return value, is there a best practice for returning a failure state?
yes, c++17 introduced std::optional, which can be empty, but it cannot have a reference so std::optional<<std::reference_wrapper<int>>
is the proper "standard" return.
std::optional<<std::reference_wrapper<int>> func()
{
static int i = 5;
if (!good)
return std::nullopt; // return {}; works here
else
return i;
}
later c++20 introduced std::expected which can also return an Error Type
to signal more information than just a "failure".
even if you are using older c++ standards you can still use optional in c++11 libraries, same as expected in c++11 libraries.
c++11 optional library can hold a reference, so you can use it for cleaner code.
tl::optional<int&> func()
{
static int i = 5;
if (!good)
return tl::nullopt; // return {}; works here
else
return i;
}