代码之家  ›  专栏  ›  技术社区  ›  Amarth Gûl

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

  •  2
  • Amarth Gûl  · 技术社区  · 7 年前

    我的讲稿上说

    常量或表达式。

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

    f(t) 这是违法的。

    但我不明白,为什么会这样 t 这是违法的。 T 是一个常数,但仍然是一个变量,我不认为传递有任何错误 T 参考。

    3 回复  |  直到 7 年前
        1
  •  1
  •   TrebledJ    7 年前

    如果函数 f 修改 var t const

    下面是一个实现的示例 F

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

    这将改变作为参数传递的任何内容。 如果争论是 常数 ... 真倒霉。这是不允许的,编译器会明确告诉您这一点。

    这是编译器生成的错误:

    error: binding reference of type 'double&' to 'const double' discards qualifiers
    

    常数 首先是变量的不确定性。

    如果你想通过引用传递它,请通过引用传递 常数

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

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

        2
  •  4
  •   flowit    7 年前

    让我加强我的评论,回答如下:

    第一, t

    const 因为限定符是类型的一部分。您不能执行以下操作:

    const int x = 1;
    int& ref_x = x;
    

    限定词

    常数 限定变量作为引用,使用常量引用或丢弃常量:

    • const int& const_int_ref = x;
    • 使用const_cast: int& rx = const_cast<int&>(x);

        3
  •  0
  •   SoronelHaetir    7 年前

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

    也就是说,以下情况可以:

    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&),这是允许的,因为当引用是常量时,赋值问题不存在。