对于此功能:
void foo_ref(const int& i)
{
cout << i << endl;
}
我在gdb中调用它时失败了:
(gdb) call foo_ref(5)
Attempt to take address of value not located in memory.
当然,在这个简单的例子中,不需要使用reference作为参数。如果我使用正常的“int”,那么没问题。
实际上真正的例子是模板函数,如下所示:
template<class T>
void t_foo_ref(const T& i)
{
cout << i << endl;
}
当“T”为“int”时,我遇到了上述问题。
这是gdb中的错误吗?或者我可以在gdb中调用这样的函数吗?
答案 0 :(得分:12)
有可能,虽然不是以直观的方式(我仍然会将其归类为错误)。
您需要一个实际的内存区域(变量或堆分配的东西)。
(gdb) p (int *) malloc(sizeof(int))
$8 = (int *) 0x804b018
(gdb) p * (int *) 0x804b018 = 17
$9 = 17
(gdb) p t_foo_ref<int>((const int&) * (const int *) 0x804b018 )
17
$10 = void
(gdb)
答案 1 :(得分:0)
5是一个文字,当你将它传递给函数时,编译器会尝试将它存储在为函数参数i分配的地址中。但由于我是一个参考,因此没有5可以存储在内存中,从而导致错误。