Шаблон C++20 ‹auto› с типом пользователя приводит к несоответствию типа T/const T в GCC 9

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

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
      |                     ^

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


person le migou    schedule 29.11.2018    source источник
comment
что за странный отступ   -  person M.M    schedule 29.11.2018
comment
@ Jarod42 Jarod42 Вы используете неправильную версию GCC, GCC поддерживает нетиповой аргумент класса С++ 20 из GCC 9. Clang пока не поддерживает.   -  person llllllllll    schedule 29.11.2018
comment
Думаю, скорее всего баг. Поддержка аргументов нетиповых шаблонов-заполнителей находится в зачаточном состоянии.   -  person AndyG    schedule 29.11.2018


Ответы (1)


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

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

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

T x = template-argument ;

Как вставка

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

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

person le migou    schedule 04.12.2018