Почему лямбда-захват меняет статус «зависимого имени» локального типа в шаблоне?C++

Программы на C++. Форум разработчиков
Anonymous
Почему лямбда-захват меняет статус «зависимого имени» локального типа в шаблоне?

Сообщение Anonymous »

Я столкнулся с запутанной проблемой, когда добавление лямбда-захвата меняет вопрос о том, требует ли компилятор ключевое слово typename для вложенного типа, определенного в шаблоне функции.
Мой код:

Код: Выделить всё

template
void foo() {
struct Local {
using Nested = int;
};

int local_var = 0;

auto lambda1 = []() {
typename Local::Nested value1;
return 0;
};

auto lambda2 = [local_var]() {
typename Local::Nested value2;
return 0;
};
}

int main() {
foo();
}
Поведение компилятора:
  • GCC и Clang: принять вариант 1 (без захвата), но отклонить вариант 2 (с захватом), требуя имя типа только в захватывающей лямбде.
  • MSVC: Отклоняет оба случая, всегда требуя typename.
  • EDG: Принимает оба случая, никогда не требуя typename.
Мои вопросы:
  • Почему добавление лямбда-захвата меняет вопрос о том, считается ли Local::Nested зависимым именем?
  • Какой компилятор соответствует стандарту C++?
  • Является ли Local::Nested действительно зависимым именем, поскольку Local определяется локально и не зависит от T?
Похоже, это связано с тем, как лямбда-захваты влияют на контекст синтаксического анализа внутри функций шаблона.>

Подробнее здесь: https://stackoverflow.com/questions/798 ... al-type-in

Вернуться в «C++»