Я хочу написать функцию, которая изменяет заданный указатель любого типа; поэтому я объявил, что моя функция принимает void*&, полагаясь на неявное преобразование любого указателя в void*. Однако следующий код отказывается компилироваться, говоря, что он не может преобразовать int*в void*&.
void f(void*& x)
{
x = 0;
}
int main() {
int* a = new int;
f(a);
delete a;
return 0;
}
Обратите внимание, что он отлично работает, если f объявлено принимающим int*& (но затем теряет свою универсальность) или если f объявлено принимающим void* (но тогда f может изменять свой аргумент только локально).
Таким образом, независимо работает правило неявного преобразования «любое T* в void*», правило неявного преобразования «T в T&» работает, но не оба одновременно? Почему это так? Что я здесь сделал не так?
(Я знаю, что мог бы использовать шаблонную функцию для f, это в основном из любопытства).
void*всегда достаточно большой, чтобы вместить указатель на любой объект. Также спорно, является ли возможная разница в размерах (кстати, нигде не замеченная в реальных реализациях) указателей объектов реальной и предполагаемой или просто придирчивой интерпретацией разбросанной стандартной формулировки. - person PlasmaHH   schedule 07.10.20130вfвы написалиnew std::vector<int>. Вы понимаете, насколько безопасным было бы это преобразование? - person molbdnilo   schedule 07.10.2013