Предположим, что у нас есть класс<Date>, который не имеет конструктора по умолчанию: нет хорошего кандидата на дату по умолчанию. У нас есть функция, которая возвращает две даты в виде<boost::tuple>:
boost::tuple<Date, Date> getPeriod();
В другом месте мы хотим использовать результат<getPeriod>, но хотим, чтобы были названы две даты:<begin>и<end>. Мы хотим реализовать что-то вроде «множественных значений возврата»:
Date begin, end;
boost::tie(begin, end) = getPeriod();
Вторая линия уже работает, это возможностиBoost. Туплебиблиотека, но первая строка не будет работать. Мы могли бы установить некоторые придуманные начальные даты, но это сбивает с толку и может быть неприемлемой стоимостью, учитывая, что эти значения будут перезаписаны в следующей строке в любом случае. В этом может помочь<optional>:
boost::optional<Date> begin, end;
boost::tie(begin, end) = getPeriod();
Он действует потому, что внутри<boost::tie>на<optional<T>>вызывается перемещение от<T>, которое внутренне называется перемещением-конструктором<T>.