【问题标题】:Why a const variable cannot be passed by reference?为什么 const 变量不能通过引用传递?
【发布时间】:2019-05-10 17:13:13
【问题描述】:

我的课堂笔记说

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

因此

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

f(t) 是非法的。

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

【问题讨论】:

  • 您可以将其作为const 引用传递,如下所示:int f(const double & var);
  • t 不是常量,而是const 变量。常数为 4.0。你的讲义基本上是在说你不能做类似int ret = f(4.0);
  • @flowit 一开始我也是这么想的,但是这个例子是在一个测验解决方案中给出的,说通过t 是非法的:parameter t is defined as a constant, i.e. const, while the formal parameter is pass by reference
  • 可以传递一个常量值(比如4.0)或const变量作为引用参数仅作为常量引用。因此,除非我误解了您的问题,否则您的讲座是不正确的(如果对于这种基本的东西不正确,我会担心)或者您错过了有关它的细节。

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


【解决方案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-reference 传递它:

int f(const double & var)  //  or int f(double const& var)
{
    var += 1;
    return var;
}

这告诉编译器保留其参数的常量性。

【讨论】:

  • 如果那个 const t 是通过引用传递的,那还能编译吗?我认为这将是运行时错误或编译警告
  • 函数参数double & var声明该参数应该通过引用传递。我不明白你在评论中想说什么?
  • 没关系,你的更新很清楚地说明了这个问题,谢谢!
【解决方案2】:

当您有一个引用参数时,传递的对象需要实际(至少能够)占用内存,常量(相对于 const 变量)不会。

I.E.以下是可以的:

void foo(int & n) {
  n = 3;
}
void bar() {
  int i;
  foo(i);
  std::cout << "i is " << i << std::endl;
}

但如果你有:

void qux() {
  foo(3);
}

foo 中的赋值将没有对象可以赋值。

请注意,您可以将常量作为对 const 的引用(即 MyType const &)传递,这是允许的,因为当引用为 const 时不存在赋值问题。

【讨论】:

  • 那么const变量与非常量变量相比实际上有不同的内存存储方式?这就是为什么 const 变量通过引用传递是非法的?
【解决方案3】:

让我增强我对答案的评论:

首先,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&amp; const_int_ref = x;
  • 使用 const_cast:int&amp; rx = const_cast&lt;int&amp;&gt;(x);

我更喜欢第一个。

【讨论】:

    猜你喜欢
    • 2015-03-24
    • 2011-09-16
    • 2013-08-22
    • 2011-02-04
    • 2017-01-20
    • 2012-07-09
    • 1970-01-01
    相关资源
    最近更新 更多