История изменений
Исправление vbr, (текущая версия) :
Но они есть. Ты читаешь этот код как будто он на Си, но это ведь не Си. Просто привыкни, что в C++ создание любого объекта приводит к вызову пачки функций.
Повторюсь, что с таким подходом сама формулировка «неявное поведение» не имеет смысла. Любой язык имеет детерминированную семантическую модель. Всегда можно сказать: «выучи язык и ничего неявного не будет». Короче просто отмахнуться от проблемы легко. Но проблема не исчезнет.
А в Rust, кстати, не приводит. Rust очевиднее C++?
Не знаю. Я его плохо знаю. Вроде бы действительно Rust в этом отношении намного лучше C++. Но уверенно утверждать не буду.
В стандартном Си, да. Но тут вступает в силу тот факт, что все обмазываются расширениями в той или иной мере. В реальном коде бывает дохрена attribute типа constructor, cleanup (по сути, defer) и так далее. Хочешь unique_ptr на Сишечке с расширениями? Их у нас есть.
«Все» это слишком смелый квантификатор. Я не обмазываюсь. Если я пишу не стандартный С, это значит, что я не придумал, как это сделать на стандартном C. Сходу вспомню только атрибуты для помещения данных в разные секции, которые потом компоновщик будет собирать определённым образом. Да и те атрибуты на 90% обусловлены «фреймворком», для себя я такое использовал только чтобы объявлять глобальные неинициализируемые объекты. Но это явная недоработка языка. Вообще не понимаю, кому в голову пришло, что глобальные переменные без инициализатора должны инициализироваться нулями. Это полностью противоречит подходу и философии C.
Исходная версия vbr, :
Но они есть. Ты читаешь этот код как будто он на Си, но это ведь не Си. Просто привыкни, что в C++ создание любого объекта приводит к вызову пачки функций.
Повторюсь, что с таким подходом сама формулировка «неявное поведение» не имеет смысла. Любой язык имеет детерминированную семантическую модель. Всегда можно сказать: «выучи язык и ничего неявного не будет». Короче просто отмахнуться от проблемы легко. Но проблема не исчезнет.
А в Rust, кстати, не приводит. Rust очевиднее C++?
Не знаю. Я его плохо знаю. Вроде бы действительно Rust в этом отношении намного лучше C++. Но уверенно утверждать не буду.
В стандартном Си, да. Но тут вступает в силу тот факт, что все обмазываются расширениями в той или иной мере. В реальном коде бывает дохрена attribute типа constructor, cleanup (по сути, defer) и так далее. Хочешь unique_ptr на Сишечке с расширениями? Их у нас есть.
«Все» это слишком смелый квантификатор. Я не обмазываюсь. Если я пишу не стандартный С, это значит, что я не придумал, как это сделать на стандартном C. Сходу вспомню только атрибуты для помещения данных в разные секции, которые потом компоновщик будет собирать определённым образом. Да и те атрибуты на 90% обусловлены «фреймворком», для себя я такое использовал только чтобы объявлять глобальные неинициализируемые объекты. Но это явная недоработка языка. Вообще не понимаю, кому в голову пришло, что глобальные переменные без инициализатора должны инициализироваться нулями.