Что происходит, когда static_cast из производного класса в базовый класс?

При чтении стандарта C++ я прочитал, что static_cast является своего рода прямой инициализацией (стандарт C++ 8.5/15).
Я думаю, это означает, что во время static_cast соответствующий перегруженный конструктор .
Например, есть тип B и тип D, производные от B, и объект D d. Тогда выражение static_cast<B>(d) является выражением static_cast.

Стандартно это выражение static_cast представляет собой прямую инициализацию. Означает ли это, что это вызовет конструктор типа B и вернет новый сконструированный объект типа B?


ИЗМЕНИТЬ
Еще один вопрос: как насчет B & b = d или B b = d? Включают ли эти два утверждения конструктор B?


person Zachary    schedule 23.06.2013    source источник


Ответы (3)


Да, static_cast для типа объекта (т. е. не приведение к типу ссылки или указателя) будет использовать соответствующий конструктор для создания временного объекта.

person Pete Becker    schedule 23.06.2013
comment
Я отредактировал свой пост, чтобы поднять другую проблему. Не могли бы вы взглянуть? - person Zachary; 24.06.2013

В стандарте они означают, что вы можете привести, например, число с плавающей запятой к целому числу. В этот момент произойдет преобразование. Можно сказать, что результирующий int в этот момент непосредственно инициализируется.

Если класс, участвующий в приведении, имеет соответствующее перегруженное преобразование, то да, он будет вызван. Я лично не рекомендовал бы активно использовать эту функцию. Ваш код будет трудно читать.

person Kirill Kobelev    schedule 23.06.2013

Нет. Прямая инициализация означает, что каждый байт внутри объекта класса B будет скопирован из объекта класса D без вызова конструкторов.

person Community    schedule 23.06.2013
comment
Нет, это не так. В некоторых ситуациях reinterpret_cast делает это, но static_cast знает о системе типов и уважает ее. - person Pete Becker; 23.06.2013