Шаблон C ++ 20 <auto>с пользовательским типом приводит к несоответствию типов T / const T в GCC 9 - PullRequest
0 голосов
/ 29 ноября 2018

Я пытаюсь использовать шаблон нетипичного типа с пользовательским типом.

struct T {};

template <auto value> struct U {};

template <auto value> 
void f (U <value>) {}

int main()
{
    constexpr T t;
    f    (U<1>{});  // OK
    f<t> (U<t>{});  // OK
    f    (U<t>{});  // Error
}

Сбой при выводе аргумента шаблона, транк gcc с -std = c ++ 2a получает

yop.cpp:10:5: note:   template argument deduction/substitution failed:
yop.cpp:19:21: note:   mismatched types ‘T’ and ‘const T’
   19 |         f    (U<t>{});  // Error
      |                     ^

Я что-то упустил или это ошибка?

1 Ответ

0 голосов
/ 04 декабря 2018

Хорошо, просматривая последний черновик ...

[temp.arg.nontype] говорит

Если тип T параметра-шаблона (12.1) содержит заполнительtype (9.1.7.5) или заполнитель для выведенного типа класса (9.1.7.6), типом параметра является тип, выведенный для переменной x в изобретенном объявлении

T x = template-argument ;

Asвставив

auto x = t;
static_assert (std::is_same_v <decltype (x), T>);

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

...