【发布时间】:2013-10-13 22:17:36
【问题描述】:
我想编写一个函数来修改任何类型的给定指针;因此我声明我的函数接受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 使用模板函数,这主要是出于好奇)。
【问题讨论】:
-
stackoverflow.com/questions/399003/…"不保证 sizeof(int *) == sizeof(double *)" - 因此无法生成符合您要求的非模板化代码。
-
@KarolyHorvath:
void*总是大到足以容纳任何对象指针。如果对象指针的可能大小差异(顺便说一句,在实际实现中看不到)是真实的和有意的,或者只是对分散的标准措辞的挑剔解释,这也是值得商榷的。 -
@PlasmaHH:我不确定你打算用这个传达什么......如果代码只是将 void* 的内存位置归零(足够大),可能会覆盖内存位置另一个变量?
-
@KarolyHorvath:除了它不能编译(因为临时变量不能绑定到非 const 引用)之外,如果它是合法的,它很可能会做预期的事情,因为在对象指针的大小纯粹是理论上的,就像推测非法语言结构的可能行为一样。
-
考虑这样一种情况,你写的是
new std::vector<int>,而不是f中的0。您知道这种转换实际上有多安全吗?
标签: c++ reference implicit-conversion