Комментарии 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++ научить выдавать ожидаемое поведение
У меня нет конструктора, но я должен инициализироваться