Search code examples
c++boostc++11unique-ptrboost-optional

When to use boost::optional and when to use std::unique_ptr in cases when you want to implement a function that can return "nothing"?


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?


Solution

  • 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 classes
    • std::unique_ptr<Person> for polymorphic classes

    because dynamic allocation incurs an overhead, so you only use it when necessary.