引用将参数传递给函数时出现奇怪的编译错误
Strange compilation error on reference passing argument to function
这是代码:
#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
,&val
是val
的地址,是指向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);
因此,对于引用,您不需要使用地址运算符&
(它是隐式完成的),而您需要它作为指针。
相关文章:
- std::is_base_of表示ctor编译错误
- Qt5:使用QCommandLineParser类时出现奇怪的编译错误
- 如何修复sfml c++代码编译错误
- 使用 MATLAB 编码器生成C++代码:编译错误"undefined reference to `rgb2gray_tbb_real64'"
- 使用外部SDK工具链文件在VisualStudio上生成项目编译错误
- vscode下的Arduino代码出现意外编译错误
- 第三方 API 中的编译错误 - Visual Studio
- std::cout输出int时出现编译错误
- 奇怪的代码抛出编译错误模板< J,int aSize=10> C2143:语法错误:在"<"之前缺少";"
- 提升图广度优先搜索前置编译错误
- C++ 中的编译错误:未定义对"主"的引用 collect2:错误:ld 返回 1 个退出状态
- 使用带有 ref 参数的成员函数创建线程时出现编译错误
- 我在C++中遇到了这个奇怪的编译错误
- 在C++中使用 Catch 测试框架编译错误"error: expected ';' at end of declaration list"
- 使用 std::enable_if 限制派生类的模板参数时出现编译错误
- 现代OpenGL和GLEW Libraray的编译错误
- C++ 编译错误:意外的类型名称"字符串":预期的表达式
- C ++程序编译错误,找不到/访问文件
- 使用直接大括号初始化时,C++ 编译错误"声明末尾的预期";"
- 为什么传递非静态成员函数会导致编译错误?