А ещё в GCC можно писать вот так:
x ? : yx ? : y, что равносильно x ? x : yx ? x : y
#gcc #extensions
кстати, подбешивает меня в boost/std::optional<T> их дизайн в том, что size(optional<T>) > size(T), требуют флаг хранить и нет механизма для специализации