c++ - 通过引用转换指针

标签 c++ casting parameter-passing pass-by-reference

我遇到了一些我不太了解的事情。假设我想将一个字符指针传递给一个引用 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/

相关文章:

c++ - 有什么好的方法可以捕捉或避免这种微妙的错误吗?

c# - 将 linq 查询转换为字符串数组 - C#

c++ - 如何惯用地将 `` char *`` 转换为 `` double *``

python - Python中如何证明参数求值是 "left to right"?

c++ - OpenGL/Glut 无法在其上绘制 [

c++ - 在类声明中使用概念

c++ - 本地 QEventLoop 是如何工作的

java类型转换困惑

java - 通过 View.OnClickListener() 传递 MainActivity 的对象

python - **(双星/星号)和 *(星号/星号)对参数有何作用?