引用 void* 的隐式类型转换

Implicit type conversion with reference to void*

本文关键字:类型转换 void 引用      更新时间:2023-10-16

我想写一个函数来修改任何类型的给定指针;因此我声明我的函数接受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 使用模板函数,这主要是出于好奇)。

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

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

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

如果它在这里有效,您将在T*中创建一个临时void*(因为这里的转换实际上意味着"创建另一种类型的新对象"),然后您将绑定引用,这将不起作用,因为它是非常量。不过,有效的是:

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

但这可能不是您的意图,因为它指的是临时的,而不是int*