Я смотрел на это answer, и мне было интересно, если листинг объекта его первому члену с reinterpret_cast и использование результата может быть безопасным в C++.reinterpret_cast от объекта к первому участнику
Давайте предположим, что у нас есть класс А, класс В и экземпляр Ь Б:
class A{
public:
int i;
void foo(){}
};
class B{
public:
A a;
};
B b;
Вопрос 1: Безопасно ли использовать b.a так: reinterpret_cast<A*>(&b)->foo()
?
Примечание: В общем случае мы предполагаем, что класс и его член являются стандартными.
В моей лекции о доступных ссылках на reinterpret_cast указано, что такое использование должно быть разрешено, так как нет нарушения псевдонимов, однако оно противоречит многим ответам, таким как this one.
Вопрос2: Можно ли использовать b.a следующим образом: static_cast<A*>(static_cast<void*>(&b))->foo()
?
Если вы пишете такие сумасшедшие вещи, не забудьте поставить static_assert на обоих классах is_standard_layout, чтобы убедиться, что в случае дальнейших изменений предположение не будет нарушено. –
+1 для справок. Но OP действительно должен понимать, что это не способ выйти за пределы лаборатории! Маленький маленький виртуальный в B и макет ушел, из-за самого противного UB ... – Christophe
@Christophe Вы абсолютно правы, я не задавал этот вопрос с намерением использовать его. И если кто-то имеет намерение использовать его, то статический_ассерт был бы очень желанным. – Arnaud