Есть ли случаи, когда & typeid (T)! = & Typeid (T)?
В основном меня интересуют компиляторы для Windows, но любая информация для Linux и других платформ также приветствуется.
Да. Под Windows DLL не может иметь неразрешенных символов, таким образом. Если у вас есть:
foo.h
struct foo { virtual ~foo() {} };
dll.cpp
#include "foo.h"
...
foo f;
cout << &typeid(&f) << endl
main.cpp
#include "foo.h"
...
foo f;
cout << &typeid(&f) << endl
Даст вам разные указатели. Потому что до загрузки dll должен существовать typeid (foo)
как в dll, так и в первичном exe
Более того, в Linux, если основной исполняемый файл не был скомпилирован с -rdynamic (или --export-dynamic), тогда typeid будет разрешен в разных символах исполняемого файла
в разделяемом объекте (что обычно не происходит на платформах ELF) из-за некоторых оптимизаций, выполняемых при компоновке исполняемого файла - удаление ненужных символов.