引用将参数传递给函数时出现奇怪的编译错误

Strange compilation error on reference passing argument to function

本文关键字:编译 错误 参数传递 函数 引用      更新时间:2023-10-16

这是代码:

#include <iostream>
using namespace std;
void mysize(int &size, int size2);
int main()
{
    int *p;
    int val;
    p = &val;
    cout << p;
    mysize(&val, 20); // Error is pointed here!
}
void mysize(int &size, int size2)
{
    cout << sizeof(size);
    size2 = size2 + 6000;
    cout << size2;
}

以下是 GCC 的错误输出:

在函数 'int main()' 中: 第 10 行:错误:从类型为"int*"的临时引用初始化类型为"int&"的非常量引用无效 编译由于 -Wfatal 错误而终止。

这意味着什么?我不明白错误消息...非常量初始化无效?我用两个参数声明了上面的原型函数,一个是整数的引用,另一个只是整数值本身。我传递了 int 的引用(参见第 10 行),但这个错误不断被抛给我。另外,它如何"临时指针"?

问题出在哪里?

val是一个int&valval的地址,是指向int的指针。您的函数需要引用。你需要这样称呼它

mysize(val, 20);

并将签名更改为

void mysize(const int &size, int size2);

或者,更好的是,

void mysize(int size, int size2);

因为您没有修改size.

您正在将整数的地址传递给mysize,该地址期望通过引用传递整数参数。将调用更改为:

mysize(val, 20); //remove &

指针和引用之间存在差异。对于引用,假设编译器确实为您"获取地址"和"取消引用",您不必(也不必)手动执行此操作。另外,请注意&运算符的不同含义。一些例子:

int a = 5;
int *pa = &a; // take address of a, store it in pa
int &ra = a; // define ra as a reference to a
// Function taking reference to long and pointer to int
void foo(long& a, int* b);
// Call it like this:
long myLong = 100;
int myInt = 10;
foo(myLong, &myInt);    

因此,对于引用,您不需要使用地址运算符&(它是隐式完成的),而您需要它作为指针。