为什么const变量不能通过引用传递?

时间:2018-12-09 17:35:36

标签: c++ const pass-by-reference

我的讲义说

  

引用参数的参数必须是变量,而不是   常数或表达式。

因此

int f(double & var); // function prototype
...
const double t = 4.0;
int ret = f(t); 

f(t)是非法的。

但是我不明白,t为什么是非法的。 t是一个常数,但仍然是一个变量,我认为通过引用传递t不会有任何错误。

3 个答案:

答案 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引用const int& const_int_ref = x;
  • 使用const_cast:int& rx = const_cast<int&>(x);

我尽可能地选择第一个。

答案 1 :(得分:1)

如果函数f修改了var,该怎么办?如果tconst,则不会发生这种情况。

这是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的引用时不存在分配问题。