Переменная mt
объявлена static
, что означает, что существует только один экземпляр (со стати c срок хранения) mt
для каждого T
в программе или в каждой единице перевода (в зависимости от является ли показанная функция функцией static
в классе или в области пространства имен) и если функция get_metatype<T>()
вызывается в программе несколько раз, только первый вызов, достигший объявления mt
, выполнит mt
' s инициализировать и инициализировать mt
. Другие вызовы просто вернут фиксированное значение mt
. Это даже гарантированно сохраняется, когда задействованы несколько потоков, без инициализации, когда-либо вызванной в двух потоках.
Использование лямбда-выражения, вызываемого напрямую, в инициализаторе позволяет поместить весь код, который должен быть выполнен только один раз, чтобы инициализировать переменную mt
в одном месте без необходимости создавать новую функцию для нее. Если вы поместите операторы внутри лямбда-выражения непосредственно в теле get_metatype<T>()
, то они будут выполняться каждый каждый раз, когда вызывается функция, а не только один раз, и ответственность за предотвращение скачков данных при инициализации при участие нескольких потоков может сместиться к вам.
В частности, возможные причины использования static
mt
здесь могут заключаться в том, что существует множество потоков и гонка данных при построении «метатипа» его следует избегать, хотя все равно может показаться, что на metatype_cache
существует состояние гонки или даже гонка данных, если выполняется несколько вызовов на get_metatype<T>()
для разных T
, поскольку find
и размещение в контейнере не выполняется атомарно.
Или возможная причина может заключаться в том, что операции поиска в get_metatype
выполняются слишком долго при каждом вызове get_metatype
, хотя переменная static
не лучший выбор для производительности Оптимизация тоже, так как она требует поточно-ориентированных проверок при каждом вызове, чтобы проверить, является ли * 1 030 * уже инициализирован.