Pull to refresh

Comments 16

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

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

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

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

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

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

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

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

UFO landed and left these words here

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

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

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

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

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

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

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

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

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

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

UFO landed and left these words here

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

UFO landed and left these words here
Sign up to leave a comment.

Articles