clang vs gcc - CTAD of struct deriving from template parameter
Consider the following code:
template <typename B>
struct D : B { };
D d{[]{ }};
-
gcc 12.x accepts it and deduces
d
to beD</* type of lambda */>
as expected. -
clang 14.x rejects it with the following error:
<source>:4:3: error: no viable constructor
or deduction guide for deduction of template arguments of 'D'
D d{[]{ }};
^
<source>:2:8: note: candidate template ignored:
could not match 'D<B>' against '(lambda at <source>:4:5)'
struct D : B { };
^
<source>:2:8: note: candidate function template not viable:
requires 0 arguments, but 1 was provided
live example on godbolt.org
Which compiler is behaving correctly here?
Solution 1:
In the code snippet, no deduction guide has been provided. P1816 added deduction guides for aggregate class templates in C++20, by requiring that an aggregate deduction candidate is generated.
The code is valid, but Clang just doesn't support P1816 yet.
Adding a deduction guide allows this to compile in Clang as well.
template <typename B> D(B) -> D<B>;