【问题标题】:Why does putting const on the left side of an ampersand valid when referring to a pointer but not on the right?为什么在引用指针而不是右侧时,将 const 放在&符号的左侧有效?
【发布时间】:2020-10-06 10:37:53
【问题描述】:

我想知道为什么这条线被认为是有效的:

Entity* const & e = this; 

但这行不是:

Entity* & const e = this;

& 符号在这里实际做什么?为什么将 const 放在它的左边是有效的,而不是放在右边?顺便说一句,这些行是一个名为 Entity 的类中的构造函数的一部分。

【问题讨论】:

  • 我很犹豫将其用作欺骗目标,但它为您提供了更多答案:stackoverflow.com/questions/3694630/…
  • 为了得到比指针引用更好的答案,我们需要更多的上下文代码来告诉你&在做什么。
  • 如果你把 const 放在 & 号的右边,它会使 & 号保持不变,这意味着你不能改变它的值。当它在左边时,指针是不变的,所以你可以给e一个值。

标签: c++ pointers reference this


【解决方案1】:

& 符号在这里实际做了什么?

它是一个标点符号,用于指定引用类型。这类似于星号指定指针类型的方式。

为什么把 const 放在左边有效,但放在右边却不行

因为 const 限定符适用于它左侧的任何内容1。如果 const 在 & 符号的右侧,则限定符将应用于引用。但这是语言所不允许的。 const 不能应用于引用(不像它可以应用于指针)。这样的资格将毫无意义。无论如何都不能修改引用。

C++ 中没有 const 引用这样的东西。虽然通俗地说,当人们实际上指的是对 const 的引用时,通常使用“const 引用”。


1 除非限定符是最左边的标记,在这种情况下它适用于右边const T&T const & 相同。所有这些也适用于 volatile。

【讨论】:

  • 可能需要编辑/澄清一下。当我写 const int i = 5 时,我很确定它没有将 const 应用于左侧。
  • +1 @Taekahn,有一个例外,即 const 可以是第一个然后它限定第一个类型,所以应该注意这一点
  • @Taekahn 添加了说明。
【解决方案2】:

Entity* const & e = this; 是“对实体的 const 指针的引用”。

Entity* & const e = this; 将是“对实体指针的常量引用”,但引用不能是 const1,因此会出现错误。


1 - 创建后,您不能“重新绑定”引用以使其指向不同的对象。正因为如此,一些人认为引用“总是 const”,但至少它具有误导性。 std::is_const 返回 false 用于引用,所以正式它们永远不会是 const

【讨论】:

    【解决方案3】:

    this 指针声明如下:

    Entity* const this
    

    这意味着它是一个指向当前对象的指针,该指针本身的值不能被修改(即this指向的地址不能被修改)。

    在第一个示例中,您声明了一个名为 e 的变量,它是对实体 (const) 指针的引用,即对实体(不变)(指针)的引用,与 this 的类型匹配。

    在第二个示例中,您声明了对实体指针的引用,其中实际指针的值/地址可能会发生变化。这里的 const 关键字不是指定指针地址的状态,而是指定引用本身不会改变,即不会引用新的 Entity*。

    事实上,正如所指出的,为限定引用而添加的“const”不会编译(因为它是多余的,没有意义,引用不能被修改),因此以下内容也是不正确的:

    int x = 5;
    int& const y = x;
    

    希望这有帮助!

    【讨论】:

      猜你喜欢
      • 2016-12-16
      • 2012-02-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-09-09
      • 1970-01-01
      相关资源
      最近更新 更多