Почему компилятор не может определить параметр автоматического шаблона, если я не добавлю const?

У меня недавно была проблема с кодом, подобным этому:

constexpr auto lambda = []{};

template<auto& l>
struct Lambda {};

template<auto& l>
void test(Lambda<l>) {}

int main() {
    test(Lambda<lambda>{});
}

И Clang, и GCC говорят, что не могут вывести l,

Однако, если я добавлю const там:

//   ----v
template<const auto& l>
void test(Lambda<l>) {}

Тогда все работает с Clang. GCC по-прежнему не работает. Что тут происходит? Может ли это не выводить const сам? Это ошибка GCC для того, чтобы не выводить l в обоих случаях?

1 ответ

Решение

Это ошибка GCC для того, чтобы не выводить l в обоих случаях?

Это ошибка, и для Clang тоже. Для нетипичного аргумента типа заполнителя [temp.arg.nontype]/1 говорит:

Если тип параметра-шаблона содержит тип заполнителя, выведенный тип параметра определяется по типу аргумента шаблона путем вывода типа заполнителя. Если выведенный тип параметра не разрешен для объявления параметра шаблона ([temp.param]), программа некорректна.

Тот самый процесс, с помощью которого он мог бы вывести здесь

int main() {
   auto& l = lambda;
}

Тот l является постоянной ссылкой.

Другие вопросы по тегам