170 похожих чатов

В каких ситуациях мне нужно использовать std::string s{}; вместо std::string

s; ?

29 ответов

23 просмотра

Можешь всегда использовать. Хуже не станет

Ramil-Rizvanov Автор вопроса
Слава
Можешь всегда использовать. Хуже не станет

то есть {} стильно модно молодежно, без них депрекейтед?

Ramil Rizvanov
то есть {} стильно модно молодежно, без них депрек...

Почему депрекейтед? Как хочешь так и делай

Ramil-Rizvanov Автор вопроса
Слава
Почему депрекейтед? Как хочешь так и делай

добавил же С++11 такую возможность, зачем?

Ramil Rizvanov
добавил же С++11 такую возможность, зачем?

Для того чтобы в шаблонном коде все инициализировать. Для тривиальных типов {} инициализирует нулем, а без них мусором

Ramil-Rizvanov Автор вопроса
Слава
Для того чтобы в шаблонном коде все инициализирова...

чтоб обеспечить в шаблоне что там мусора не будет?

Ramil Rizvanov
чтоб обеспечить в шаблоне что там мусора не будет?

Что у тебя переменная инициализирована была

Ramil-Rizvanov Автор вопроса
Ramil Rizvanov
ну т.е. нули , не мусор, в шаблоне

Условно template<class T> void foo() { T t; } Если так, то при Т=int, то в t мусор, а если {}, то ноль

Ramil-Rizvanov Автор вопроса
Ramil-Rizvanov Автор вопроса
Слава
Условно template<class T> void foo() { T t; } Е...

правильно ли я понял, что при инициализации struct A { int a; }; в поле A::a мы получим мусор? т.е. default initialization? не value initialization?

Ramil-Rizvanov Автор вопроса
Дмитрий Ш
а откуда там взяться данным?

не откуда, от того и вопрос, default initializer или value initializer

Ramil-Rizvanov Автор вопроса
Denis P
Зависит от того где объект

как он сам был инициализирован?

Ramil-Rizvanov Автор вопроса
Denis P
Ну вот так

если A a;. то a.a default initalized если A a{};. то a.a value initalized верно?

Ramil Rizvanov
правильно ли я понял, что при инициализации struct...

фатальный недостаток вашего примера в том, что 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 в конструкторе)

Ramil-Rizvanov Автор вопроса
Vlad
фатальный недостаток вашего примера в том, что A э...

преклоняюсь перед вашим умением лавировать в стандарте. получается поле класса int без default initializer и без member initialization list будет рандомным мусором?

Ramil Rizvanov
преклоняюсь перед вашим умением лавировать в станд...

если по-простому (забыть об агрегатах, например), то да

Ramil-Rizvanov Автор вопроса
Ramil Rizvanov
в агрегатах value initialization?

веселее http://eel.is/c++draft/dcl.init#aggr-5.2

Ramil Rizvanov
= {} ?

да, только всегда copy-initialization я не уверен, что это всегда правда для = {}

Ramil-Rizvanov Автор вопроса
Vlad
да, только всегда copy-initialization я не уверен,...

судя по стандарту именно = {}, интересно почему именно копирование... чтобы иногда конструктор копирования отрабатывался?

Ramil Rizvanov
судя по стандарту именно = {}, интересно почему им...

я лишь цитировал тот пункт из инициализации агрегатов. почему он так написан сказать не могу, но намерение явно в том, что в этом случае работает copy-initialization и так, будто инициализатор это = {}. а не, например, что инициализация работает как будто там просто = {} (что потребует определения, какой вид инициализации использовать)

Ramil-Rizvanov Автор вопроса
Vlad
фатальный недостаток вашего примера в том, что A э...

на 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.

Ramil Rizvanov
на cppreference накопал If the number of initiali...

Оберните код в теги: 3 символа ` до и после кода (в случае одиночной конструкции достаточно 1 ` с обеих сторон). Спасибо!

Похожие вопросы

Обсуждают сегодня

а через ESC-код ?
Alexey Kulakov
29
30500 за редактор? )
Владимир
47
Чёт не понял, я ж правильной функцией воспользовался чтобы вывести отладочную информацию? но что-то она не ловится
notme
18
У меня есть функция где происходит это: write_bit(buffer, 1); write_bit(buffer, 0); write_bit(buffer, 1); write_bit(buffer, 1); write_bit(buffer, 1); w...
~
13
Недавно Google Project Zero нашёл багу в SQLite с помощью LLM, о чём достаточно было шумно в определённых интернетах, которые сопровождались рассказами, что скоро всех "ибешни...
Alex Sherbakov
5
в JclConsole объявлено так: function CtrlHandler(CtrlType: DWORD): BOOL; stdcall; - где ваше объявление с stdcall? у вас на картинке нет stdcall
Karagy
8
Как передать управляющий символ в открытую через CreateProcess консоль? Собсна, есть процедура: procedure TRedirectThread.WriteData(Data: OEMString); var Written: Cardinal;...
Serjone
6
Ребят в СИ можно реализовать ООП?
Николай
33
Вот еще странный косяк, подскажите как бороться. Я git clone сделал себе всего embassy и примеры там запускаю. Всё хорошо. Но вот решил в cargo.toml зависимости не как в приме...
Lukutin R2AJP
2
program test; {$mode delphi} procedure proc(v: int32); overload; begin end; procedure proc(v: int64); overload; begin end; var x: uint64; begin proc(x); end. Уж не знаю...
notme
6
Карта сайта