/ / C ++ ist die Initialisierung statischer Variablen mit = atomic? - C ++, Initialisierung, Singleton

C ++ ist die Initialisierung statischer Variablen mit = atomar? - C ++, Initialisierung, Singleton

Das Meyers Singleton hängt davon ab, dass Die Initialisierung der lokalen statischen Variablen ist atomar.

Ich baue etwas ähnliches, aber ich möchte, dass das Singleton tatsächlich einer von mehreren abgeleiteten Typen ist. Die Basisklasse getInstance() Methode sollte eine Fabrik aufrufen, die den entsprechenden Typ zurückgibt.

Meine erste Idee ist

static Foo *instance = FooFactory(...);

8.5p2 von N3337 scheint zu zeigen, dass dies streng genommen Initialisierung ist und nicht Initialisierung und Zuweisung und ich interpretiere das, um zu bedeuten, dass die gesamte Aussage atomar ist. Ist das richtig?

Wenn nicht, würde die Aussage

static Foo *instance(FooFactory(...));

Sei anders?

Bearbeiten Sie 8.5.2 -> 8.5.p2

Antworten:

1 für die Antwort № 1

8.5.2 ist "[dcl.init.string]" und scheint nicht relevant zu sein. Ich denke du meinst 8.5 para2.

Ja, das ist genau die Initialisierung (speziell Initialisierung kopieren - siehe 8.5 Abs. 14).

Wenn sich die Deklaration in einer Funktion befindet, dann wie Die Antwort auf die verknüpfte Frage zeigt, Alles ist gut.

Wenn dies jedoch eine statische Variable im Namespace istScope, dann kann ich nichts sehen, was die Initialisierung erfordert, um Thread-sicher zu sein. (Das ist nur ein Problem, wenn die Initialisierung Threads erstellt - aber ich wette, dass es tut.)


1 für die Antwort № 2

variable_type variable_name = initializer ist immer Initialisierung und nicht Standard-Konstruktion und Zuordnung. [dcl.init] / 15 hat

Die Initialisierung, die in dem Formular auftritt

T x = a;

sowie in Argument übergeben, Funktion zurückgeben,Das Auslösen einer Ausnahme (15.1), die Behandlung einer Ausnahme (15.3) und die Initialisierung von Aggregatelementen (8.5.1) wird als Kopierinitialisierung bezeichnet. [Hinweis: Die Kopierinitialisierung kann eine Bewegung auslösen (12.8). Endnote]


1 für die Antwort № 3

Seit C ++ 11, Initialisierung von statischen VariablenDie lokalen Funktionen sind atomar und threadsicher, also sind Ihre Codezeilen Thread-sicher und praktisch gleichwertig. (Syntax-weise ruft Ihre erste Version einen Kopierkonstruktor auf, aber kein Compiler erzeugt es).

Es ist jedoch nicht klar, welche Argumente für Ihre Factory-Funktion zur Verfügung stehen und woher werden diese übernommen?