/ / C ++ е статична променлива инициализация с = атомна? - c ++, инициализация, singleton

C ++ е статична променлива инициализация с = атомна? - c ++, инициализация, singleton

Meyers Singleton зависи от факта, че локалната стационарна променлива инициализация е атомна.

Аз съм изграждане на нещо подобно, но аз искам singleton действително да бъде един от редица извлечени видове. Базов клас getInstance() методът трябва да се обади на фабрика, която ще върне съответния тип.

Първата ми идея е

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

8.5p2 от N3337 изглежда, показва, че това е строго инициализиране, а не инициализация и задаване и аз тълкувам това, че цялото твърдение е атомно. Дали това е правилно?

Ако не беше това изявление

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

Бъди различен?

Редактиране 8.5.2 -> 8.5.p2

Отговори:

1 за отговор № 1

8.5.2 е "[dcl.init.string]" и не изглежда релевантен. Мисля, че имаш предвид 8.5.

Да, това е строго инициализиране (конкретно копиране инициализация - вж. 8.5, параграф 14).

Ако декларацията е във функция, тогава, като отговорът на свързания въпрос показва, всичко е наред.

Все пак, ако това е статична променлива в пространството на именатане мога да видя нищо, което изисква инициализацията да е безопасна за нишката (Това е само проблем, ако инициализацията създава нишки - но залагам това.)


1 за отговор № 2

variable_type variable_name = initializer е винаги инициализация, а не по подразбиране конструкция и задание. [dcl.init] / 15 е

Инициализацията, която се появява във формата

T x = a;

както и при преминаване на аргументи, връщане на функции,изхвърлянето на изключение (15.1), обработването на изключение (15.3) и инициализирането на агрегирания член (8.5.1) се нарича копие-инициализация. [Забележка: Инициализацията на копиране може да предизвика преместване (12.8). -Забележка]


1 за отговор № 3

От C ++ 11, инициализация на статични променливикоито са локални към функции, е атомна и безопасна за конеца, така че да, вашите линии на код са безопасни за нишката и практически еквивалентни. (Синтаксис-първата ви версия призовава за copy constructor, но компилатор няма да го генерира).

Не е ясно обаче какви аргументи ще бъдат предоставени на фабричната ви функция и къде ще бъдат взети тези?