Boost C++ Libraries of the most highly regarded and expertly designed C++ library projects in the world. Herb Sutter and Andrei Alexandrescu, C++ Coding Standards

This is the documentation for a snapshot of the develop branch, built from commit 8c27b21d00.

Bypassing unnecessary default construction

Suppose we have class Date, which does not have a default constructor: there is no good candidate for a default date. We have a function that returns two dates in form of a boost::tuple:

boost::tuple<Date, Date> getPeriod();

In other place we want to use the result of getPeriod, but want the two dates to be named: begin and end. We want to implement something like 'multiple return values':

Date begin, end; // Error: no default ctor!
boost::tie(begin, end) = getPeriod();

The second line works already, this is the capability of Boost.Tuple library, but the first line won't work. We could set some invented initial dates, but it is confusing and may be an unacceptable cost, given that these values will be overwritten in the next line anyway. This is where optional can help:

boost::optional<Date> begin, end;
boost::tie(begin, end) = getPeriod();

It works because inside boost::tie a move-assignment from T is invoked on optional<T>, which internally calls a move-constructor of T.