2017-01-10 5 views
0
struct Base { 
    int i, j; 
}; 

struct Derived : Base {}; 

С выше сценарию, если мы следующее:У производного класса нет дополнительных данных; Безопасно ли статически опускать базовый объект на производный объект?

Base b; 
auto& d = static_cast<Derived&>(b); 
d.i = 1; 

Будет ли это неопределенное поведение?

Примечание: По некоторым причинам я не могу редактировать код автоматически созданной библиотеки google protobuf. Следовательно, расширение этих классов на мой пользовательский класс, который предоставляет больше типов API &, но у него нет дополнительного члена данных.

+0

@pSoLT, спасибо. [Downcasting с использованием Static_cast в C++] (http://stackoverflow.com/q/6322949/514235). Это сильно связано. В этом Qn мне будет больше интересно узнать, когда размеры потенциально одинаковы. Кстати, если кто-то чувствует, что принятый ответ в этом посте также относится к этому Qn, тогда будет здорово, если кто-нибудь сможет объяснить на более понятном языке. Я просто потерялся, читая этот отрывок из стандарта. :-) – iammilind

ответ

2

Да, это неопределенное поведение. Использование static_cast для преобразования из базового класса в производный тип, который не является экземпляром объекта, является неопределенным поведением.

Кроме того, вы нарушаете строгое правило сглаживания путем доступа к объекту через переменный недопустимый типа (не динамический типа, базовый класс динамического типа, char или unsigned char типа, а также несколько других случаев).

+0

Я думаю, что практический также следует отметить. Я не могу придумать какой-либо компилятор, который бы обнаружил уныние и делал вредные вещи. Примером такого (бытия) такого поведения было бы весьма полезно. –

+1

@ Cheersandhth.-Alf: Независимо от того, будет ли кто-либо из современных авторов компилятора вести себя нечетно, для компиляторов модно пытаться идентифицировать случаи, когда определенные входы вызывали бы Undefined Behavior, а затем устраняли условные тесты, которые всегда возвращали бы то же значение во всех остальных случаях. Я скептически отношусь к тому, что такие «оптимизации» будут предлагать соотношение затрат и выгод, которое почти так же хорошо, как и с директивами, чтобы предлагать компиляторам делать определенные предположения о входных значениях, но я не контролирую моды. – supercat

Смежные вопросы