Портирую код с винды на линукс/мак.
template<typename TYPE>
class ttt {
public:
ttt() {
m_Pointer = "<null>" ;
}
ttt( const ttt<TYPE>& src ) {
m_Pointer = src.m_Pointer ;
}
const TYPE* m_Pointer ;
};
void main() {
ttt<char> c0 ;
c0.m_Pointer = "Hello World!!!" ;
printf( "%u--%s--%u", 0x55, c0, 0xAA ) ;
}
GCC передает не
копию лежащего в c0, а указатель на c0, и получается полный алес! Если же убрать копи конструктор из декларации класса, то замечательно передается копия и все работает. Причем GCC сам генерит копи конструктор, который и вызывает. При моем копи конструкторе даже упоминания нет.
Вторая проблема с clang, он компилирует код с -Wno-error=non-pod-varargs, но вставляет ud2 (invalid opcode) перед сгенерированным кодом, те мы сделали что ты просил, но фиг ты это запустишь. Это можно как-то обойти?
ЗЫ. Все эксперименты проводились при выключенных оптимизациях.
ЗЫЫ. здесь можно поэксперементировать:
https://godbolt.org/z/-PMwXh