Я считаю, что вложенные лямбда-выражения очень медленно компилируются и генерируют огромные файлы .obj. Например, на моем компьютере следующий код создает файл obj размером 4766 КБ:
int main()
{
auto f = []
{
auto f = []
{
auto f = []
{
auto f = []
{
auto f = []
{
};
};
};
};
};
}
А следующий код (добавлен еще один уровень вложенности) вызовет C1128 ошибка.
int main()
{
auto f = []
{
auto f = []
{
auto f = []
{
auto f = []
{
auto f = []
{
auto f = []
{
};
};
};
};
};
};
}
Кроме того, они очень медленно компилируются. Есть ли объяснение этому? Я использую Visual C ++ 2013.
Это похоже на ошибку в Visual C ++, я сообщил об этом в Microsoft: https://connect.microsoft.com/VisualStudio/feedback/details/813755/nested-lambdas-in-visual-c-2013-are-very-slow-to-compile-and-generate-huge-object-file.
Не уверен, насколько полезны такие глубоко вложенные лямбды, но для чего он стоит, насколько я могу судить, это ошибка, Компилятор Visual Studio ограничивает документ состояния (акцент мой):
Стандарт C ++ рекомендует ограничения для различных языковых конструкций. Ниже приведен список конструкций, в которых компилятор Visual C ++ не реализует рекомендуемые ограничения. первое число является рекомендуемым пределом, а второе число является пределом, реализованным в Visual C ++:
и включает в себя следующую маркировку:
Уровни вложенности составных операторов, структуры управления итерациями и структуры управления выбором [256] (256).
Если мы посмотрим на грамматику в Проект стандарта C ++ компаунд-заявление в конечном итоге вернется к первичное выражение который включает в себя лямбда-выражение. Таким образом, Visual Studio должна поддерживать до 256
уровни вложенности.
Вы также можете увидеть это, посмотрев на грамматику лямбда-выражение что следующим образом:
лямбда-интродьюсер лямбда-деклараторвыбирать компаунд-заявление
проект стандарта имеет набор рекомендуемых пределов в Приложение Б но они только руководящие принципы и не определяют соответствие.
Обновить
сообщение об ошибке поле OP было недавно обновлено, чтобы указать, что это будет исправлено в следующем выпуске.
Компиляция вашего второго примера дает:
$ time cl x.cpp
Microsoft (R) C/C++ Optimizing Compiler Version 18.00.21005.1 for x64
Copyright (C) Microsoft Corporation. All rights reserved.
x.cpp
Microsoft (R) Incremental Linker Version 12.00.21005.1
Copyright (C) Microsoft Corporation. All rights reserved.
/out:x.exe
x.obj
real 0m0.764s
user 0m0.000s
sys 0m0.140s
Размер
$ ls -lh x.exe
-rwxrwxrwx 1 lt None 118K 14. Jan 16:33 x.exe
Я не вижу никаких проблем.