В следующем примере инициализация 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)