#include <iostream>
#include <tchar.h>

void output(int *param)
{
    std::cout << "Value: " << *param << std::endl;
};

int _tmain(int argc, _TCHAR* argv[])
{
    int i = 34;

    output(&i);

    return 0;
}

显然会在控制台上写入“Value:34”。

但是如果我进行以下更改
...
void output(int **param)
{
    std::cout << "Value: " << **param << std::endl;
}
...
    output(&(&i));
...

我收到一个编译错误“'&'需要左值”。

顺便说一句,我什至尝试进行以下更改:
output(&34);

确实,这感觉不对……。

我的问题是:为什么不允许使用r值的&?在汇编程序级别上有什么原因吗?

最佳答案

您正在尝试获取对r值的引用,并且该引用基本上没有定义,因为它始终是一个临时值,并且实际上在堆栈上没有地址。这就是C++ 11引入r值引用的原因,但这与您的问题完全不同。

为了使您的代码编译需要执行以下操作:

int   i = 34;
int* pi = &i;

output(&ip);

通过将您在pi中的引用“接地”,可以为编译器提供可在堆栈上提供给output的真实地址。

关于c++ - 将临时指针传递给对象的临时指针,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/21231918/

10-13 05:54