Демо
Сначала проблема: у меня есть существующая структура с конструктором по умолчанию, который переводит ее в допустимое состояние.Мне нужен конструктор NoInit, который вообще не инициализируется.Существующий код имеет несколько операторов инициализации во время объявления для переменных-членов, отсюда и пример для struct B
, где я пытаюсь переопределить операторы инициализации во время объявления путем явного вызоваконструктор по умолчанию std::atomic
.
std::atomic
конструктор по умолчанию не инициализирует:
Конструктор по умолчанию тривиален: не происходит инициализация, кроме нулевой инициализации static и thread-local объекты.
Итак, почему вызов конструктора по умолчанию должен приводить к любому присваиванию в сборке?
struct A {
std::atomic<long> a;
std::atomic<long> b;
int c;
A() : a{1}, b{2}, c{3} {} // This is obviously fine.
A(DefaultInit) : a(), b(), c() {} // Should this not be similar to NoInit?
A(NoInit) {} // This is fine. Results in no code
};
Второй конструктор A(DefaultInit)
приводит к присваиванию 0 длятри переменные-члены, тогда как A(NoInit)
не приводит к коду вообще.
struct B {
std::atomic<long> a{1};
std::atomic<long> b{2};
int c{3};
B() {} // This is fine.
B(NoInit) : a(), b(), c() {} // Why setting to 0? Why should it generate any assignment code at all?
};
Во втором примере struct B
B(NoInit)
пытается явно вызвать std::atomic::atomic()
, что должно привести к отсутствию store/mov
инструкция.Но это приводит к присвоению 0 всем трем переменным!
Конечно, стандарт говорит, что это неопределенное поведение, если так, то почему разница между A(DefaultInit)
и A(NoInit)
.Я хочу, чтобы сборка B(NoInit)
была такой же, как A(NoInit)
.
Также обратите внимание, что результирующая сборка не отличается для переменной-члена c
в обоих случаях.Это не имеет отношения к std::atomic