Информация об изменениях

Сообщение Re: Zero initialization от 05.09.2021 18:20

Изменено 05.09.2021 18:45 rg45

Re: Zero initialization
Здравствуйте, Videoman, Вы писали:

V>Теперь если смотреть на все это в контексте какого-нибудь шаблонно метода, то как я понимаю, мы не можем обеспечить такое-же поведение по умолчанию:

V>
V>    type_t a;   // Тут не происходит инициализации и в случае любого другого POD и в случае T
V>}


Здесь происходит Default initialization в любом случае. Просто этот вид инициализации по-разному работает для POD и не-POD типов.

V>
V>    type_t b(); // А вот тут в случае POD происходит инициализация нулями, а в случае T её нет ???
V>}


А вот тут ты попался. Не происходит здесь никакой инициализации, потому что это просто объявление функции b без параметров, с типом возвращаемого значения type_t: http://coliru.stacked-crooked.com/a/f697f7b4c41fa766

V>Как быть в таком случае и обеспечить однообразное обобщенное поведение ? По идее, в шаблонном методе можно написать что-то типа: type_t a(0), но тогда все типы должны будут иметь конструктор который принимает 0. Вопрос к знатокам, как правильно разрулить такую ситуацию?


Не понимаю я, что ты хочешь здесь разрулить. Инициализация объекта-то происходит (вызывается определенный пользователем дефолтный конструктор). Просто разработчик класса Т решил, что при инициализации объекта класса инкапсулируемые этим объектом члены-данные должны остаться без инициализации, такова его воля. На то они и конструкторы, чтобы полностью контролировать процесс инициализации объекта. А вот если эти члены-данные являются открытыми (public), то такому разработчику следовало бы надавать по рукам, конечно.
Re: Zero initialization
Здравствуйте, Videoman, Вы писали:

V>Теперь если смотреть на все это в контексте какого-нибудь шаблонно метода, то как я понимаю, мы не можем обеспечить такое-же поведение по умолчанию:

V>
V>    type_t a;   // Тут не происходит инициализации и в случае любого другого POD и в случае T
V>


Здесь происходит Default initialization в любом случае. Просто этот вид инициализации по-разному работает для POD и не-POD типов.

V>
V>    type_t b(); // А вот тут в случае POD происходит инициализация нулями, а в случае T её нет ???
V>


А вот тут ты попался. Не происходит здесь никакой инициализации, потому что это просто объявление функции b без параметров, с типом возвращаемого значения type_t: http://coliru.stacked-crooked.com/a/f697f7b4c41fa766

V>Как быть в таком случае и обеспечить однообразное обобщенное поведение ? По идее, в шаблонном методе можно написать что-то типа: type_t a(0), но тогда все типы должны будут иметь конструктор который принимает 0. Вопрос к знатокам, как правильно разрулить такую ситуацию?


Не понимаю я, что ты хочешь здесь разрулить. Инициализация объекта-то происходит (вызывается определенный пользователем дефолтный конструктор). Просто разработчик класса Т решил, что при инициализации объекта класса инкапсулируемые этим объектом члены-данные должны остаться без инициализации, такова его воля. На то они и конструкторы, чтобы полностью контролировать процесс инициализации объекта. А вот если эти члены-данные являются открытыми (public), то такому разработчику следовало бы надавать по рукам, конечно.