Почему компилятор не может определить параметр автоматического шаблона, если я не добавлю 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
является постоянной ссылкой.