Я знаю, что С++ не поддерживает ковариацию для элементов контейнера, как в Java или С#. Таким образом, следующий код, вероятно, имеет поведение undefined:
#include <vector>
struct A {};
struct B : A {};
std::vector<B*> test;
std::vector<A*>* foo = reinterpret_cast<std::vector<A*>*>(&test);
Неудивительно, что я получил downvotes, когда предлагаю это решение для другого вопроса.
Но какая часть стандарта С++ точно подсказывает мне, что это приведет к поведению undefined? Он гарантировал, что оба std::vector<A*>
и std::vector<B*>
сохраняют свои указатели в ограниченном блоке памяти. Это также гарантировало, что sizeof(A*) == sizeof(B*)
. Наконец, A* a = new B
является совершенно законным.
Итак, какие плохие духи в стандарте я вызываю (кроме стиля)?