6 Basic concepts [basic]

6.6 Start and termination [basic.start]

6.6.3 Dynamic initialization of non-local variables [basic.start.dynamic]

Динамическая инициализация нелокальной переменной со статической продолжительностью хранения неупорядочена, если переменная является неявно или явно созданной специализацией, частично упорядочена, если переменная является встроенной переменной, которая не является неявно или явно конкретизированной специализацией, и в противном случае упорядочена . [ Note: Явно специализированный не встроенный статический член данных или специализация шаблона переменной упорядочили инициализацию. ]end note

Динамическая инициализация нелокальных переменных V и W со статической продолжительностью хранения упорядочены следующим образом :

  • Если V и W имеют упорядоченную инициализацию и V определены ранее W в одной единице трансляции, инициализация V выполняется в последовательности перед инициализацией W.

  • Если V имеет частично упорядоченную инициализацию, W не имеет неупорядоченной инициализации и V определен ранее W в каждой единице перевода, в которой W определена, то

    • если программа запускает поток ([intro.multithread]), отличный от основного потока ([basic.start.main]), инициализация V строго выполняется до инициализации W;

    • в противном случае инициализация V выполняется до инициализации W.

  • В противном случае, если программа запускает поток, отличный от основного, до инициализации V или W , то не указано, в каких потоках происходит инициализация V и W происходит; инициализации не имеют последовательности, если они происходят в одном потоке.

  • В противном случае инициализации V и W имеют неопределенную последовательность.

[ Note: Это определение позволяет инициализировать последовательность упорядоченных переменных одновременно с другой последовательностью. ]end note

A non-initialization odr-use - это odr-use ([basic.def.odr]), не вызванная прямо или косвенно инициализацией нелокальной статической переменной или переменной продолжительности хранения потока.

Это определяется реализацией, будет ли динамическая инициализация нелокальной внелинейной переменной со статической продолжительностью хранения последовательно перед первым оператором main или откладывается. Если это отложено, это обязательно произойдет до любого неинициализационного odr-использования любой не встроенной функции или не встроенной переменной, определенной в той же единице перевода, что и инициализируемая переменная.36 Это определяется реализацией, в каких потоках и в каких точках программы происходит такая отложенная динамическая инициализация. [ Note: Такие точки следует выбирать таким образом, чтобы позволить программисту избежать взаимоблокировок. ] [end noteExample:

// - File 1 -
#include "a.h"
#include "b.h"
B b;
A::A(){
  b.Use();
}

// - File 2 -
#include "a.h"
A a;

// - File 3 -
#include "a.h"
#include "b.h"
extern A a;
extern B b;

int main() {
  a.Use();
  b.Use();
}

Это определяется реализацией ли либо a или b инициализируется до main ввода , или задерживаются на инициализацию до тех пор , a пока первый ODR используемый в main. В частности, если a инициализируется до main ввода, не гарантируется, что b будет инициализирован до того, как он будет использован odr при инициализации a, то есть перед вызовом A​::​A . Если, однако, a инициализируется в какой-то момент после первого оператора main, b будет инициализирован до его использования в A​::​A. ] end example

Это определяется реализацией, будет ли динамическая инициализация нелокальной встроенной переменной со статической продолжительностью хранения упорядочена до первого оператора main или откладывается. Если это отложено, это обязательно произойдет до любого использования этой переменной без инициализации. Это определяется реализацией, в каких потоках и в каких точках программы происходит такая отложенная динамическая инициализация.

Это определяется реализацией, будет ли динамическая инициализация нелокальной не встроенной переменной с продолжительностью хранения потока последовательной перед первым оператором начальной функции потока или откладывается. Если это отложено, инициализация, связанная с объектом для потока t , упорядочивается перед первым использованием неинициализации odr t любой не встроенной переменной с продолжительностью хранения потока, определенной в той же единице перевода, что и инициализируемая переменная. Это определяется реализацией, в каких потоках и в каких точках программы происходит такая отложенная динамическая инициализация.

Если инициализация нелокальной переменной со статической продолжительностью хранения или продолжительностью хранения потока завершается через исключение, std​::​terminate вызывается.

В этом случае инициализируется нелокальная переменная со статической продолжительностью хранения, имеющая инициализацию с побочными эффектами, даже если она сама не используется odr ([basic.def.odr], [basic.stc.static]).