Почему лямбда-захват меняет статус «зависимого имени» локального типа в шаблоне?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
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

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