0

我想编写一个修改任何类型的给定指针的函数;因此我声明我的函数接受 a void*&,依赖于从任何指针到void*. 但是下面的代码拒绝编译,说它不能转换int*void*&.

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

int main() {

    int* a = new int;
    f(a);
    delete a;
    return 0;
}

请注意,如果 f 被声明为接受 a int*&(但随后失去其普遍性)或 f 被声明为接受 a void*(但 f 只能在本地修改其参数),则它工作正常。

因此,“任何T*void*”隐式转换规则独立工作,“TT&隐式转换规则”工作,但不能同时工作?为什么会这样?我在这里做错了什么?

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

4

2 回答 2

2

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

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

template<typename T>
void f(T*& x) { ... }
于 2013-10-07T11:12:03.317 回答
0

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

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

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

于 2013-10-07T11:12:58.300 回答