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