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.