Почему нужно указывать тип указателя в C++?

Если в язык встроена функция typeid, почему компилятор сам не может привести указатель из типа void к нужному типу при разыменовании средствами вызова вышеуказанного оператора? Примеры:

int k = 111;
void* p = &k;

//Выведет ошибку, тк "не знает" какой тип у указателя
cout << *p;

Почему компилятор не может сделать что-то вроде этого:

int k = 111;
void* p = &k;

// "typeid(k)" вместо этого должен стоять какой-то "определитель" типов
cout << *static_cast<(typeid(k))*>(p);  

Эквивалентно этому коду:

int k = 111;
void* p = &k;

cout << *static_cast<int*>(p);

Компилятор МОЖЕТ в теории узнать какой тип мне нужен, просто посмотрев на тип объекта, на который я ссылаюсь с помощью указателя. Если не прав - поправьте меня.


Ответы (2 шт):

Автор решения: AR Hovsepyan

В С++ есть возможность рассмотреть объект с разной точки зрения. и компилятор должен знать вашу точку зрения для создания объектного файла. Например такой код:

 int a = 1<<10;
 void* p = &a;
 //  компилятор не знает  как что вы рассматриваете объект
 //поэтому разыменовывать void* нельзя
 //а вдруг вы хотите разместить символ 'a' в объект (а)
 new(p)char('a');
 //и иметь возможность  получать и часть объекта?    
 cout <<"Вывести символ\n " << *static_cast<char*>(p)
      << "\nВывести как число " << *static_cast<int*>(p);
→ Ссылка
Автор решения: timur
int k = 111;
double l = 222.43;
void* p;

if (l < 100)
    p = &k;
else
    p = &l;

//cout << *p;  Как компилятор должен узнать тип?
→ Ссылка