[PATCH] c++: CTAD and deduction guide selection [PR86439]

Jonathan Wakely jwakely@redhat.com
Tue Jun 22 20:05:13 GMT 2021

On Tue, 22 Jun 2021 at 19:45, Patrick Palka wrote:
> This change causes us to reject some container CTAD examples in the
> libstdc++ testsuite due to deduction failure for {}, which AFAICT is the
> correct behavior.  Previously, in the case of e.g. the first removed
> example for std::map, the type of {} would be deduced to less<int> as a
> side effect of forming the call to the selected guide
>   template<typename _Key, typename _Tp, typename _Compare = less<_Key>,
>              typename _Allocator = allocator<pair<const _Key, _Tp>>,
>              typename = _RequireNotAllocator<_Compare>,
>              typename = _RequireAllocator<_Allocator>>
>       map(initializer_list<pair<_Key, _Tp>>,
>           _Compare = _Compare(), _Allocator = _Allocator())
>       -> map<_Key, _Tp, _Compare, _Allocator>;
> which made later overload resolution for the constructor call
> unambiguous.  Now, the type of {} remains undeduced until constructor
> overload resolution, and we complain about ambiguity with the two
> constructors
>   map(initializer_list<value_type> __l,
>       const _Compare& __comp = _Compare(),
>       const allocator_type& __a = allocator_type())
>   map(initializer_list<value_type> __l, const allocator_type& __a)
> This patch just removes these problematic container CTAD examples.

Do all the problematic cases have a corresponding case that doesn't
use {} but uses an actual type?

If not, we might want to add such cases, to ensure we're still
covering all the cases that really *should* work.

More information about the Gcc-patches mailing list