我的讲义说
引用参数的参数必须是变量,而不是 常数或表达式。
因此
int f(double & var); // function prototype
...
const double t = 4.0;
int ret = f(t);
f(t)
是非法的。
但是我不明白,t
为什么是非法的。 t
是一个常数,但仍然是一个变量,我认为通过引用传递t
不会有任何错误。
答案 0 :(得分:4)
让我增强对答案的评论:
首先,t
不是常量,而是const变量。常数为4.0。您的讲义基本上是在说您不能做int ret = f(4.0);
第二,您看到的是类型不匹配。 const
作为限定符是该类型的一部分。您不能执行以下操作:
const int x = 1;
int& ref_x = x;
错误:将“ int&”类型的引用绑定到“ const int”丢弃 限定符
尽管如此,传递const
限定变量作为引用是合法的,可以使用const引用或丢弃const:
const int& const_int_ref = x;
int& rx = const_cast<int&>(x);
我尽可能地选择第一个。
答案 1 :(得分:1)
如果函数f
修改了var
,该怎么办?如果t
是const
,则不会发生这种情况。
这是f
的示例实现:
int f(double & var)
{
var += 1;
return var;
}
这将更改作为参数传递的内容。 但是,如果论点是const
...很不幸。然后它是不允许的,编译器会明确告诉您。
这是编译器生成的错误:
error: binding reference of type 'double&' to 'const double' discards qualifiers
因此,通过将一个const
变量传递给该函数(不带非const参数),就可以告诉编译器首先忽略变量的const
性质。
如果您希望通过引用传递,请通过 const
-引用传递:
int f(const double & var) // or int f(double const& var)
{
var += 1;
return var;
}
这告诉编译器保留其参数的常数。
答案 2 :(得分:0)
具有引用参数时,传递的对象实际上需要(至少能够)占用内存,而常量(与const变量相对)则不需要。
I.E。可以的:
Request.Form["wnd_area_listbox"]
但如果您有:
void foo(int & n) {
n = 3;
}
void bar() {
int i;
foo(i);
std::cout << "i is " << i << std::endl;
}
在foo中没有分配对象。
请注意,您可以传递一个常量作为对const的引用(即MyType const&),这是允许的,因为当对const的引用时不存在分配问题。