我想编写一个修改任何类型的给定指针的函数;因此我声明我的函数接受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的模板函数,这主要是出于好奇)。
答案 0 :(得分:2)
这是因为参考位。对指向一种类型的指针的引用与对另一种类型的指针的引用不同。
这当然可以通过使用模板来解决:
template<typename T>
void f(T*& x) { ... }
答案 1 :(得分:0)
如果它可以在这里工作,你可以在void*
中创建一个临时T*
(因为这里的转换真的意味着“创建另一种类型的新对象”)然后你会绑定一个引用to,哪个不起作用,因为它是非const的。可行的是:
void f(void* const & x)
{
x = 0;
}
但这可能不是你想要的,因为它指的是临时的,而不是int*
。