Следующий удаленный код не работает с последним clang++ 5, но принят g++ 7:
template<typename Wrapped, typename U>
struct wrapper;
template<typename Wrapped, typename U=int>
struct wrapper
{
wrapper() = default;
// Automatic deduction guide
constexpr explicit wrapper(Wrapped) noexcept {}
};
int main()
{
struct {} dummy;
constexpr auto wrapped = wrapper(dummy);
}
Он не работает со следующими сообщениями об ошибке:
<source>:18:30: error: no viable constructor or deduction guide for deduction of template arguments of 'wrapper'
constexpr auto wrapped = wrapper(dummy);
^
<source>:12:24: note: candidate template ignored: couldn't infer template argument 'U'
constexpr explicit wrapper(Wrapped) noexcept {}
^
<source>:4:8: note: candidate template ignored: could not match 'wrapper<Wrapped, U>' against '(anonymous struct at <source>:17:5)'
struct wrapper;
^
<source>:9:5: note: candidate function template not viable: requires 0 arguments, but 1 was provided
wrapper() = default;
^
Однако, если я перенулю параметр шаблона по умолчанию =int
из определения шаблона класса в декларацию вперед, все работает отлично (U
выводится на int
как ожидалось), как если бы только шаблон по умолчанию в переднем объявлении принимался во внимание при создании набор шаблонов вымышленных функций, используемых гидами дедукции.
Я попытался прочесть стандартную формулировку, но не смог извлечь из этого ничего для этого конкретного случая. Является ли только параметр шаблона по умолчанию в объявлении вперед предполагаемым поведением при создании шаблонов вымышленных функций или это ошибка компилятора?