【问题标题】:How "const int *const & variable" is interpreted in c++如何在 C++ 中解释“const int *const & variable”
【发布时间】:2018-01-04 01:18:57
【问题描述】:

当一个变量将两个变量别名为

int a;
const int &b = a;

这两个变量实际上是同一件事,因此应用于变量a 的任何更改也会应用于变量b。但是,当使用指针完成相同的技巧时,它似乎不会以相同的方式工作,如下面的程序所示:

#include <iostream>
int main(void) {

    int *a = (int*) 0x1;
    const int *const &b = a;// Now b should be an alias to a.
    a = (int*) 0x2;// This should change b to 0x2.
    std::cout << b << "\n";// Outputs 0x1 instead of the expected value of 0x2.

    return 0;
}

现在变量a 似乎毕竟不是变量b 的别名,但为什么呢?

【问题讨论】:

  • 在您的第一个示例中,您仅在引用类型中添加了 one const。在您的第二个示例中,您突然添加了 two consts。为什么是两个?这就是使您的第二个示例与第一个示例非常不同的原因。如果你想要相似性,你应该简单地完成int *const &amp;b = a;。这将使您的第二个示例的行为与您的第一个示例相似。
  • 恕我直言,编译器应该对这种情况发出警告。
  • 之所以使用两个const修饰符是因为我想防止通过b修改指针数据。
  • 注意a被声明指向内存地址0x1,也就是UB开头。你不能只写内存中的某个地方,尤其是0x1。您应该将a 指向某个正确的地址。

标签: c++ pointers reference constants


【解决方案1】:

const int *const &amp; 是对const 的引用,指向const int。 (尝试从右到左读取。)注意指针的类型是const int *,而不是int *(即a的类型)。引用不能直接绑定不同的类型。对于const int *const &amp;b = a;,将构造一个临时的*(类型为const int *,从a 复制)然后绑定到引用;临时文件与a 无关,因此对b 的任何修改都不会影响a

注意区别。在第一个样本中,const 限定于int;在第二个示例中,const 不仅适用于指针本身,还适用于指针对象,这使得两个指针类型不同(int *const int *)。如果你想在它上面限定const(这对你的实验来说似乎没有必要)你应该只在指针本身上限定它,即int * const &amp;


*lifetime of the temporary 被延长到引用 b 的生命周期。

【讨论】:

  • 删除第一个 const 修饰符确实会导致变量 ab 成为别名,但是,我不明白为什么不能在这种情况下声明 b一种防止修改数据的方法 (*b = ),同时将 ba 混淆。
  • @marde 我可能无法正确理解您的意思;你可以用这种方式声明b,它确实可以防止像*b = ...那样对指针进行修改;即使b 不是a 的别名,但ba 仍然指向同一个指针;所以将b 声明为指向const 的指针符合您的意图。
  • 将 b 声明为指向 const (const int *b = a) 的指针将以所需的方式工作,除非我稍后更改指针 a,例如使用 (a = malloc(SIZE))。然后指针b 仍将指向旧位置,这是不想要的。
  • @marde AFAIK,你无法做到这一点,即当a = ... b 也受到影响并且*b = ... 被禁止时。
  • @marde 或者您也可以将a 更改为指向const 的指针,即const int *a;但它也会让*a = ... 成为不可能。
【解决方案2】:

const int * const &amp; b 表示引用指向 const int 的 const 指针。你要的是int * const &amp; b

使用这个方便的工具来破译复杂的声明。 https://cdecl.org/

【讨论】:

  • Hm +1 只是为了那个链接
猜你喜欢
  • 2021-09-14
  • 1970-01-01
  • 1970-01-01
  • 2015-07-16
  • 1970-01-01
  • 2010-11-11
相关资源
最近更新 更多