s; ?
Можешь всегда использовать. Хуже не станет
то есть {} стильно модно молодежно, без них депрекейтед?
Почему депрекейтед? Как хочешь так и делай
добавил же С++11 такую возможность, зачем?
Для того чтобы в шаблонном коде все инициализировать. Для тривиальных типов {} инициализирует нулем, а без них мусором
чтоб обеспечить в шаблоне что там мусора не будет?
Что у тебя переменная инициализирована была
ну т.е. нули , не мусор, в шаблоне
Условно template<class T> void foo() { T t; } Если так, то при Т=int, то в t мусор, а если {}, то ноль
понял, спасибо
правильно ли я понял, что при инициализации struct A { int a; }; в поле A::a мы получим мусор? т.е. default initialization? не value initialization?
а откуда там взяться данным?
не откуда, от того и вопрос, default initializer или value initializer
Зависит от того где объект
как он сам был инициализирован?
если A a;. то a.a default initalized если A a{};. то a.a value initalized верно?
фатальный недостаток вашего примера в том, что A это не просто class type — это агрегатный тип, инициализация которых вынесена в отдельную главу стандарта. A::a в A a{} будет инициализирован согласно dcl.init#aggr-5.2 если представить, что он просто class type, тогда согласно dcl.init#general-9.1.1 он будет default-initialized, что означает вызов конструктора продолжая гипотетический пример смотрим, что делает неявный конструктор по умолчанию: class.default.ctor#4.sentence-2 и class.base.init#9.3, то есть снова default initialization. замечу, что мы и так внутри неявного конструктора по умолчанию, который вызван как часть default-initialization из предыдущего абзаца, что значит, что эта механика рекурсивна, пока для data member'а не написан инициализатор (либо в определении класса, либо в member initializer list в конструкторе)
преклоняюсь перед вашим умением лавировать в стандарте. получается поле класса int без default initializer и без member initialization list будет рандомным мусором?
если по-простому (забыть об агрегатах, например), то да
в агрегатах value initialization?
веселее http://eel.is/c++draft/dcl.init#aggr-5.2
да, только всегда copy-initialization я не уверен, что это всегда правда для = {}
судя по стандарту именно = {}, интересно почему именно копирование... чтобы иногда конструктор копирования отрабатывался?
я лишь цитировал тот пункт из инициализации агрегатов. почему он так написан сказать не могу, но намерение явно в том, что в этом случае работает copy-initialization и так, будто инициализатор это = {}. а не, например, что инициализация работает как будто там просто = {} (что потребует определения, какой вид инициализации использовать)
на cppreference накопал If the number of initializer clauses is less than the number of members and bases (since C++17) or initializer list is completely empty, the remaining members and bases (since C++17) are initialized by their default member initializers, if provided in the class definition, and otherwise (since C++14) copy-initialized from empty lists, in accordance with the usual list-initialization rules (which performs value-initialization for non-class types and non-aggregate classes with default constructors, and aggregate initialization for aggregates). If a member of a reference type is one of these remaining members, the program is ill-formed.
Оберните код в теги: 3 символа ` до и после кода (в случае одиночной конструкции достаточно 1 ` с обеих сторон). Спасибо!
Обсуждают сегодня