Гарантирует ли инициализация класса скобками, что все члены инициализируются по умолчанию? - PullRequest
0 голосов
/ 04 сентября 2018

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

0 голосов
/ 04 сентября 2018

Что соответствует вашему примеру из ссылки

T object {}; // (4) (since C++11)

Инициализация значения выполняется в следующих ситуациях:
...
4) когда именованная переменная (автоматическая, статическая или локальная для потока) объявляется с помощью инициализатора, состоящего из пары фигурных скобок.

Эффекты инициализации значения:
...
2) если T является типом класса с конструктором по умолчанию, который не предоставлен и не удален пользователем (то есть это может быть класс с неявно определенным или дефолтным конструктором по умолчанию), объект инициализируется нулями и затем инициализируется по умолчанию, если у него есть нетривиальный конструктор по умолчанию;

Так что в вашем случае нулевая инициализация будет иметь место.

Если T является типом класса, не являющимся объединением, все базовые классы и элементы нестатических данных инициализируются нулями, а все заполнение инициализируется нулевыми битами . Конструкторы, если таковые имеются, игнорируются.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...