В самом деле, эта проблема происходит от слов в стандартном проекте N4582:Как понять, что реализации разрешено рассматривать динамическую инициализацию нелокальной переменной как статическую инициализацию в некоторых случаях?
[basic.start.static/3] Реализация разрешено выполнять инициализацию переменной со статическим или хранения нити длительностью как статическая инициализация, даже если такая инициализация не требуется статически, при условии, что
- динамическая версия инициализации не изменяет значение любого другого объекта статической или продолжительности хранения потоков до его инициализации и
- статическая версия инициализации производит такое же значение в инициализированной переменной, как и при динамической инициализации, если все переменные, которые не должны быть инициализированы статически, инициализируются динамически.
Означают ли эти слова, что если два условия, не-локальная переменная типа класса может быть полностью инициализирован статически (нуль-инициализации), так что конструктор не вызывается (с динамической версии, инициализация вызывая конструктор, может быть заменен статической версией)?
Если класс имеет определенный пользователем конструктор, он определенно будет вызван. Независимо от того, инициализирован ли он до вызова конструктора, мне не ясно. –
Это только моя интерпретация, но я сомневаюсь, что нулевая инициализация перед «вызовом» конструктора требуется - целью конструктора, помимо прочего, является инициализация памяти, занимаемой объектом. Правила статической и динамической инициализации влияют на порядок построения отдельных объектов. Однако правила являются рекурсивными, поскольку объекты имеют базы и содержат элементы, которые инициализируются перед вызовом конструктора. Член класса, не являющийся классом (например, 'int'), может быть нулевым инициализирован в этом процессе. – Peter
@RSahu Спасибо за ваш ответ, но я хочу сказать, почему конструктор определенно будет называться? Вызов конструктора - это поведение в динамической инициализации, но, как говорят эти слова в стандарте, динамическая инициализация разрешена как статическая инициализация. – xskxzr