https://gcc.gnu.org/bugzilla/show_bug.cgi?id=94890
Ville Voutilainen <ville.voutilainen at gmail dot com> changed:
What |Removed |Added
----------------------------------------------------------------------------
Assignee|unassigned at gcc dot gnu.org |ville.voutilainen at
gmail dot com
CC| |ville.voutilainen at gmail dot
com
Last reconfirmed| |2020-05-01
Ever confirmed|0 |1
Status|UNCONFIRMED |ASSIGNED
--- Comment #5 from Ville Voutilainen <ville.voutilainen at gmail dot com> ---
What happens with std::tuple<c> x({0}) is that the _UElements&&... constructor
is not a direct candidate, so we fall back to trying a copy constructor. That's
a match, and then it tries to convert the argument. Since c is constructible
from int, but not convertible from int, the match is the explicit constructor,
and calling that fails because initializing the argument is copy-init.
The fix that we can apply in tuple is to make __is_implicitly_constructible
look at either is_convertible or is_aggregate, and then negate properly
in __is_explicitly_constructible.
In other words, mine. :)