Вывод типа для конструктора по умолчанию с типом шаблона по умолчанию - PullRequest
0 голосов
/ 01 ноября 2018

Предполагая, что у меня есть этот пример типа:

template < class T = void > struct Test { };

template < > struct Test<void> { };

И этот тип руководства по выводу:

template<class T> Test() -> Test<T>;

Следующие компиляции просто отлично:

Test f;

На GCC это.

Тем не менее, на Clang. Руководство по удержанию должно быть:

template<class T = void> Test() -> Test<T>;

Итак, мой вопрос: Какой вопрос правильный?

Если тип шаблона по умолчанию присутствует как в дедукции, так и в базовом типе или только в базовом типе и предполагается, что он будет выбран компилятором.

Стволовая версия GCC и Clang была протестирована на godbolt.org с использованием -O3 -std=c++17

1 Ответ

0 голосов
/ 01 ноября 2018

Во-первых, вам на самом деле не нужно руководство по выводам для этого типа - учитывая, что параметр шаблона класса уже установлен по умолчанию. Если вы предоставляете руководство по удержанию, оно должно быть:

Test() -> Test<void>;

Не имеет смысла делать это шаблоном руководства по вычетам.

<ч />

Тем не менее, я бы сказал, что это не ошибка ... ни от одного из компиляторов. Нет ничего неправильного в написании руководства по выводам, которое содержит параметры вывода, как показано в вашем примере:

template<class T> Test() -> Test<T>;

Но хотя эта конструкция разрешена стандартом, на самом деле бессмысленно когда-либо это делать. Смысл руководства по удержанию состоит в том, чтобы ... направлять удержание. Если вы предоставите не вычитаемое руководство по выводу, какой смысл в этом? Ошибка Clang здесь кажется мне очень полезной - она ​​предупреждает вас о том, что вы написали код, который явно неверен.

Если мы педантичны, лягушатник. Но практически я предпочитаю результат clang gcc.

...