Как и большинство методов программирования, вложенные функции следует использовать тогда и только тогда, когда они уместны.
Вы не обязаны использовать этот аспект, но если вы хотите, вложенные функции уменьшают необходимость передачи параметров путем прямого доступа к локальным переменным их содержащей функции. Это удобно Тщательное использование «невидимых» параметров может улучшить читаемость. Неосторожное использование может сделать код намного более непрозрачным.
Отказ от некоторых или всех параметров усложняет повторное использование вложенной функции в другом месте, потому что любая новая содержащая функция должна будет объявлять те же переменные. Повторное использование обычно хорошо, но многие функции никогда не будут использоваться повторно, поэтому часто это не имеет значения.
Поскольку тип переменной наследуется вместе с ее именем, повторное использование вложенных функций может дать вам недорогой полиморфизм, такой как ограниченная и примитивная версия шаблонов.
Использование вложенных функций также создает опасность ошибок, если функция непреднамеренно получает доступ или изменяет одну из переменных своего контейнера. Представьте себе цикл for, содержащий вызов вложенной функции, содержащей цикл for, использующий тот же индекс без локального объявления. Если бы я проектировал язык, я бы включил вложенные функции, но потребовал бы объявления «наследовать х» или «наследовать констант х», чтобы сделать его более очевидным и избежать непреднамеренного наследования и модификации.
Существует несколько других применений, но, возможно, самое важное, что могут делать вложенные функции, - это разрешать внутренние вспомогательные функции, которые не видны извне, расширять статические, а не внешние функции C и C ++ или частные, а не общедоступные функции C ++. Наличие двух уровней инкапсуляции лучше, чем один. Он также допускает локальную перегрузку имен функций, поэтому вам не нужны длинные имена, описывающие тип каждого из них.
Существуют внутренние сложности, когда содержащая функция хранит указатель на содержащуюся функцию, и когда допускается несколько уровней вложенности, но разработчики компиляторов занимаются этими проблемами уже более полувека. Нет технических проблем, затрудняющих добавление в C ++, чем в C, но преимущества меньше.
Переносимость важна, но gcc доступен во многих средах, и по крайней мере еще одно семейство компиляторов поддерживает вложенные функции - IBM xlc, доступная в AIX, Linux в PowerPC, Linux в BlueGene, Linux on Cell и z / OS. Увидеть
http://publib.boulder.ibm.com/infocenter/comphelp/v8v101index.jsp?topic=%2Fcom.ibm.xlcpp8a.doc%2Flanguage%2Fref%2Fnested_functions.htm
Вложенные функции доступны в некоторых новых (например, Python) и многих других традиционных языках, включая Ada, Pascal, Fortran, PL / I, PL / IX, Algol и COBOL. В C ++ даже есть две ограниченные версии - методы в локальном классе могут обращаться к статическим (но не автоматически) переменным, содержащимся в его функции, а методы в любом классе могут обращаться к членам и методам данных статического класса. В будущем стандарте C ++ есть функции lamda, которые являются действительно анонимными вложенными функциями. Так что мир программирования имеет большой опыт за и против с ними.
Вложенные функции полезны, но будьте осторожны. Всегда используйте любые функции и инструменты там, где они помогают, а не там, где им больно.