On Tue, Jan 31, 2017 at 8:48 AM Ville Voutilainen <ville.voutilai...@gmail.com> wrote: > > On 31 January 2017 at 00:41, Ville Voutilainen > <ville.voutilai...@gmail.com> wrote: > > I don't actually need to constrain it, I could just add a guide like > > template <typename _Tp> optional(optional<_Tp>) -> optional<_Tp>; > > However, I'm not convinced I need to. The preference to an explicit > guide is, at least based > on that paper, a tie-breaker rule. If the copy/move constructors are > better matches than the guide, > those should be picked over a guide. Jason?
Yes, but they are not "better matches". They are equally good matches after deduction and substitution. The mechanism that selects template<class T> void f(const optional<T>&) over template<class T> void f(T) given an optional<int> argument is partial ordering, and that's the last tiebreaker in the list, *after* the implicit/explicit guide tiebreaker.