Почему нужно указывать тип указателя в 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; Как компилятор должен узнать тип?