Я хочу написать функцию, которая изменяет заданный указатель любого типа; поэтому я объявил, что моя функция принимает 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, это в основном из любопытства).