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

时间:2013-10-30 21:51:04

标签: c++ reference compiler-errors

以下是代码:

#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&amp;'类型的非const引用的无效初始化来自临时的'int *'类型   由于-Wfatal-errors而导致编译终止。

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

问题是什么?

3 个答案:

答案 0 :(得分:4)

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

mysize(val, 20);

并将签名更改为

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

或者,甚至更好,

void mysize(int size, int size2);

因为您没有修改size

答案 1 :(得分:1)

您正在将整数的地址传递给mysize,它希望通过引用传递整数参数。将呼叫更改为:

mysize(val, 20); //remove &

答案 2 :(得分:0)

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

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);    

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