Семантически и концептуально, а также в отношении Святого Стандарта, он будет создаваться каждый раз.
Остальное зависит от вашего компилятора и от того, как вы его поддерживаете:
Возможно компилятор может встроить вызов, а затем переместить выведенные инварианты за пределы одной точки инициализации,
Возможно компилятору не нравится, что ваша функция имеет внешнюю связь, и поэтому она не встроена в нее, а затем испытывает трудности с просмотром этого инварианта из других функций.
Возможно компилятор всегда будет проверять постоянство переменных и использовать однократную инициализацию, когда он может заглянуть внутрь и убедиться, что boost::assign::map_list_of( A, "A" )( B, "B" )( C, "C" )
не изменяет глобальное состояние.
Множество факторов, и единственный способ убедиться в этом - взглянуть на сгенерированный код.
В ответ на запрос предложения:
3.7.2.3 [basic.std.auto]:
Если именованный автоматический объект имеет инициализацию или деструктор с побочными эффектами, он не должен быть уничтожен до конца своего блока и не должен быть удален какоптимизация, даже если она не используется, за исключением того, что объект класса или его копия могут быть удалены, как указано в "
. Это в основном означает, что либо у него есть побочные эффекты, в этом случае он не будетбыть исключенным или не имеющим, и в этом случае он едва заметен в C ++, это эффективно означает:
Наблюдаемое поведение всегда , как если бы оно вызывалось каждый раз .
Другими словами: Нет способа гарантировать, что инициализация происходит только один раз с автоматическим хранением, поэтому никогда не принимайте обратное .