【问题标题】:C++ rvalue and pointer of pointer when should I use it?C++ 右值和指针的指针什么时候应该使用它?
【发布时间】:2015-10-31 02:43:20
【问题描述】:

请考虑这两行代码

void doStuff(int ** i)
void doStuff2( int && i) 

在第一个中,我假设它是指针的指针,第二个是右值, 我遇到了this question,它解释了右值,但我什么时候应该使用第一个,什么时候应该使用第二个?

你能帮我解释一下吗?

【问题讨论】:

  • && 不是引用的引用,而是右值引用。
  • 第二个不是“引用的引用”(没有这样的东西),它是一个右值引用。它的使用需要一篇完整的论文。
  • 指针的指针在 C++ 中几乎不会经常使用,因为引用、智能指针和容器的流行。我发现它在遍历老式单链表时最有用。
  • 比较右值引用和指向指针的指针是没有意义的。它们是完全不同的东西。
  • @RiadhHAJAMOR - IMO 你不应该在 C++ 中真正使用 **,除非你正在处理旧的 C API,如 && - 这主要用于移动语义的上下文中。

标签: c++ pointers reference


【解决方案1】:

int ** i 是一个指向指针的指针。

一般来说,请谨慎使用它,因为它可能有不同的含义,并且您有更好的方式在 C++ 中表达它。

它可能是一个指向单个变量的指针,其中包含一个指向单个 int 的指针:

int value = 0;
int * pValue = &value;
int ** ppValue = &pValue;

然而,每个也可能是指向数组第一个元素的指针:

int valuesA[1000], valuesB[100], valuesC[10];
int * pValues[] = { valuesA, valuesB, valuesC };
   // these are actually pointers to the first element of the array
int ** ppValues = pValues;

使用这个,并附上如何访问元素、如何知道元素大小、谁负责释放(如果有的话)、指针有效期等多长时间的清晰文档。

通常,如果你有这样一个数组/矩阵,你当然应该将它包装在一个安全使用的接口后面,或者将它全部替换,例如带有vector<vector<int>>

即使对于单整数用例,通常也有更好的选择。例如。允许修改指针的函数签名,对指针的引用会更合适:

bool SelectValue(int *& p) { ... }

int && 是一个右值引用

int ** 不同,这不是双重间接。

大致是一个也可以绑定到临时值的引用。 (“普通”引用不能)。

A Brief Introduction to Rvalue References

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2010-09-11
    • 2010-10-14
    • 2011-10-04
    • 2015-10-29
    • 2010-11-02
    • 2010-12-06
    • 2010-12-28
    相关资源
    最近更新 更多