Компилятор должен создать переменную container
в скомпилированном объектном файле.Это компоновщик, который может определить, нужен он или нет (для символа export
ed или из другого модуля компиляции, если объявлен extern
).
Но ...
Тип Cont<x>
не имеет отношения к Cont<x+1>
.Вы не можете зависеть от памяти переменной-члена, размещаемой в подобных модах.Черт возьми, вы даже не можете знать, выглядит ли он одинаково, поскольку существует такая вещь, как «специализация шаблона»:
// your code
template <size_t size>
class Cont{
public:
char charArray[size];
};
// my evil tweak
// I'm the worst compiler ever but I feel that this
// array would better be represented as a map...
template<> class Cont<12> {
std::map<int,char> charArray;
};
// your screwed up result
Cont<12> c12;
Cont<11>& c11( reinterpret_cast<Cont<11>&>(c12) );
char (&s11)[11] = c11.charArray; // points to the first byte of a list object...
EDIT - комментарий @ UncleBen наводит на мысль, что я переусердствовал здесь.И он прав.
в соответствии с wikipedia ,
- Указатель на объект POD-структуры, соответствующим образом преобразованный с использованием переинтерпретации приведения, указывает наего начальный член и наоборот, подразумевая, что в начале POD-структуры нет заполнения.
Так что в этом случае
где charArray
является первым членом Cont<n>
, и нет членов, не являющихся POD
, нет ни оператора присваивания, ни деструктора
Это безопасно.