Неявное преобразование функции указателя в C ++: какой компилятор прав? Clang и GCC не согласны - PullRequest
10 голосов
/ 07 июня 2019
template <typename Type, Type Func>
struct A
{
};

void func();

A<void(), func> a; // same result with A<void(), &func> a;

Этот код компилируется с Clang (включая последнюю версию 8.0.0), но не с GCC (включая последнюю версию 9.1).

GCC говорит: error: 'void()' is not a valid type for a template non-type parameter

Какой компилятор являетсяправильно и почему?

Обновление

Я предполагаю, что GCC не так, потому что следующие компиляции на Clang и GCC:

template <void()>
struct A
{
};

void func();

A<func> a; // same result with A<&func> a;

Так что вопреки тому, что сообщает GCC вВ первом примере void() представляется «допустимым типом для шаблона не типового параметра»

1 Ответ

6 голосов
/ 07 июня 2019

Аналогично тому, что происходит с типом параметра функции , если тип нетипичного параметра шаблона является типом функции, он настраивается на указатель на тип функции [temp.param] / 8

Нетипизированный шаблон-параметр типа «массив T» или типа функции T настраивается на тип «указатель на T».

Так что лязг прав. Отчет об ошибке GCC уже существует ошибка # 82773


Только текущий рабочий проект стандарта c ++ распознает процесс подстановки аргумента шаблона в следующие параметры шаблона. Таким образом, можно утверждать, что стандарт не ясен, поскольку он не определяет, что корректировка типа выполняется после каждой из этих замен.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...