Как стать автором
Обновить

Комментарии 16

Оригинальный заголовок статьи (I Have No Constructor, and I Must Initialize) отсылает к названию рассказа Харлана Эллисона "I Have No Mouth, and I Must Scream", и перевести его стоило бы не в таком стиле, как у вас.

Представьте, если бы название рассказа переводили бы как "Рта у меня нет, а кричать надо" (название совпадает с завершающими словами рассказа, где сверхразумный военный ИИ уничтожил человечество и пытает последнего человека).

https://ru.wikipedia.org/wiki/У_меня_нет_рта,_но_я_должен_кричать

далее попадает в мусор

совсем режет глаз.

Лучше так: "заполняется мусором". И, конечно же, потом этот мусор можно заменить осмысленным значением.

“Заполняется мусором” ничуть не лучше, поскольку за словом “заполняется” стоит какое-то активное действие. А по факту никаких таких действий в коде нет. Объект буквально размещается на куче мусора (хоть на куче, хоть в стеке), и больше никаких действие не происходит.

Начнет инициализировать как массив, солнечная система начнет лагать, люди вымрут

...и попадут в мусор!

НЛО прилетело и опубликовало эту надпись здесь

Назначенная инциализация мастхев, но насколько знаю она из мира Си и не совсем стандарт до С++23(?)

Стандарт с C++20, но там есть свои особенности.

Если у вас в агрегате лежат только объекты – можете себе позволить. А если есть простые типы (int, указатели) – лучше б написать конструктор, чтобы потом не развлекаться в отладчике.

T foo{}; гарантированно зануляет простые типы.

Вот если вы наоборот добавите конструктор, но не упомянете в нем эти поля -- тогда да, они не будут инициализированы.

И какая гарантия, что в вызывающем коде будет написано "T foo{};", а не "T foo;"?

Никаких гарантий ни на что, в том числе и что вы не забудете добавить новое поле в список инициализации или что вызывающий код не аллоцирует "объект" через malloc().

Если вам кажется, что в вашем случае нужно конструктор, то пишите конструктор. Но при использовании небольшой структуры фигурные скобки достаточная гарантия, что конкретно с этим объектом в отладчике развлекаться не придется.

Я конкретно этот момент и прокомментировал -- нет, если в агрегате лежат не только объекты, но и простые типы, T{} все равно отработкет как и задумано.

К слову, контейнеры стандартной библиотеки тоже выполняют value initialization, так что и за вызывающий код в виде std::vector или std::map можно не переживать.

НЛО прилетело и опубликовало эту надпись здесь

проще C# научить компилировать в машинный код чем C++ научить выдавать ожидаемое поведение

НЛО прилетело и опубликовало эту надпись здесь
Зарегистрируйтесь на Хабре, чтобы оставить комментарий

Публикации

Истории