参考void *的隐式类型转换

时间:2013-10-07 11:05:31

标签: c++ reference implicit-conversion

我想编写一个修改任何类型的给定指针的函数;因此我声明我的函数接受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*”隐式转换规则有效,“TT&隐式转换规则有效,但不能同时运行?为什么会这样?我在这里犯了什么错?

(我知道我可以使用f的模板函数,这主要是出于好奇)。

2 个答案:

答案 0 :(得分:2)

这是因为参考位。对指向一种类型的指针的引用与对另一种类型的指针的引用不同。

这当然可以通过使用模板来解决:

template<typename T>
void f(T*& x) { ... }

答案 1 :(得分:0)

如果它可以在这里工作,你可以在void*中创建一个临时T*(因为这里的转换真的意味着“创建另一种类型的新对象”)然后你会绑定一个引用to,哪个不起作用,因为它是非const的。可行的是:

void f(void* const & x)
{   
     x = 0; 
}

但这可能不是你想要的,因为它指的是临时的,而不是int*