clang vs gcc — CTAD структуры, полученной из параметра шаблона

Рассмотрим следующий код:

      template <typename B>
struct D : B { };

D d{[]{ }};
  • gcc 12.x принимает его и выводит d быть D</* type of lambda */> как и ожидалось.

  • clang 14.x отклоняет его со следующей ошибкой:

      <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

живой пример на godbolt.org


Какой компилятор ведет себя правильно здесь?

1 ответ

Во фрагменте кода не предоставлено руководство по выводу. В P1816 добавлены руководства по выводу для шаблонов агрегированных классов в C++20, требующие создания кандидата на агрегированный вывод .

Код действителен, но Clang просто еще не поддерживает P1816 .

Добавление руководства по дедукции также позволяет скомпилировать это в Clang .

      template <typename B> D(B) -> D<B>;
Другие вопросы по тегам