Гарантирует ли инициализация класса скобками, что все члены инициализируются по умолчанию?
В следующем примере выполняется инициализация Vec3
с фигурными скобками гарантируют, что все x
, y
, а также z
инициализировать по умолчанию (func_a()
), в отличии от func_b()
где все члены получают неопределенные значения?
struct Vec2 { float x, y; };
struct Vec3 { Vec2 xy; float z; };
auto func_a() {
Vec3 v{};
return v;
}
auto func_b() {
Vec3 v;
return v;
}
Если так, есть ли исключение, когда элемент не инициализируется, даже если класс, к которому он принадлежит, инициализируется фигурными скобками?
Clang и GCC дают разные сборки для func_b()
,
В Clang сборка единая ret
заявление.
В GCC сборка похожа на func_a ():
mov DWORD PTR [rsp-24], 0x00000000
mov DWORD PTR [rsp-20], 0x00000000
pxor xmm1, xmm1
movq xmm0, QWORD PTR [rsp-24]
ret
(Ссылка для просмотра компилятора https://godbolt.org/z/XqwgSV)
1 ответ
Что соответствует вашему примеру из ссылки
T object {}; // (4) (since C++11)
Инициализация значения выполняется в следующих ситуациях:
...
4) когда именованная переменная (автоматическая, статическая или локальная для потока) объявляется с помощью инициализатора, состоящего из пары фигурных скобок.Эффекты инициализации значения:
...
2) если T является типом класса с конструктором по умолчанию, который не предоставлен и не удален пользователем (то есть это может быть класс с неявно определенным или дефолтным конструктором по умолчанию), объект инициализируется нулями, а затем инициализируется по умолчанию, если у него есть нетривиальный конструктор по умолчанию;
Так что в вашем случае инициализация будет нулевой.
Если T является типом класса, не являющимся объединением, все базовые классы и нестатические члены данных инициализируются нулями, а все заполнение инициализируется нулевыми битами. Конструкторы, если таковые имеются, игнорируются.