From what I understand there are 2* ways you can implement a function that sometimes doesnt return a result(for example is person found in a list of ppl).
*- we ignore raw ptr version, pair with a bool flag, and exception when none found version.
boost::optional<Person> findPersonInList();
or
std::unique_ptr<Person> findPersonInList();
So are there any reasons to prefere one over the other?
It depends: do you wish to return a handle or a copy.
If you wish to return a handle:
Person*
boost::optional<Person&>
are both acceptable choices. I tend to use a Ptr<Person>
class which throws in case of null access, but that's my paranoia.
If you wish to return a copy:
boost::optional<Person>
for non polymorphic classesstd::unique_ptr<Person>
for polymorphic classesbecause dynamic allocation incurs an overhead, so you only use it when necessary.