我遇到了一些我不太了解的事情。假设我想将一个字符指针传递给一个引用 void 指针的函数。
void doStuff(void*& buffer)
{
// do something
}
我通常会这样做:
int main()
{
unsigned char* buffer = 0;
void* b = reinterpret_cast<void *>(buffer);
doStuff(b);
return 0;
}
为什么不能直接将 reinterpret_cast 传递给函数?
int main()
{
unsigned char* buffer = 0
// This generate a compilation error.
doStuff(reinterpret_cast<void *>(buffer));
// This would be fine.
doStuff(reinterpret_cast<void *&>(buffer));
return 0;
}
这种行为背后一定有充分的理由,但我没有看到。
最佳答案
在第一个示例中,您实际上传递的是指针变量 b。所以它有效。
在第二个示例中,第一个 reinterpret_cast 返回一个指针(按值),该指针与函数应获取的引用不匹配,而第二个返回所述引用。
作为向您展示引用如何工作的示例,请查看这两个函数,
void doSomething( unsigned char *ptr );
void doSomethingRef( unsigned char *&ptr );
假设我们有这个指针,
unsigned char *a;
两个函数的调用方式相同,
doSomething( a ); // Passing pointer a by value
doSomethingRef( a );// Passing pointer a by reference
虽然它看起来像是按值传递,但该函数采用引用,因此它将作为引用传递。
引用类似于指针,但它必须用左值初始化并且不能为空。
话虽如此,除了使用 void* 尤其是 void*& 之外,还有很多更好的选择。 void* 使代码更难阅读,更容易搬起石头砸自己的脚(如果有的话,让自己使用这些奇怪的转换)。
正如我在评论中所说,您可以使用模板,而不必费心进行 void 转换。
template< class T > void doStuff( T *&buffer ) {
...
}
或者,
template< class T > T* doStuff( T* buffer ) {
...
}
编辑:附带说明,您的第二个示例缺少分号,
unsigned char* buffer = 0; // Right here
关于c++ - 通过引用转换指针,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30835799/