【问题标题】:Const pointer pointing to non-const data [duplicate]指向非常量数据的常量指针[重复]
【发布时间】:2021-04-19 04:41:06
【问题描述】:

考虑以下情况1:

const int n = 5;
int* p = &n; 

这是无效的,因为&n 的类型为cont int*p 的类型为int *(类型不匹配错误)。

现在,考虑这种情况 2:

int k = 4;
int *const p = &k; 

此案例编译成功,没有任何错误。显然,pint * const 类型,&kint * 类型。在这种情况下,存在类型不匹配,但它是有效的。

问题:为什么第二种情况有效,即使类型不匹配?

【问题讨论】:

  • 您可以将非常量分配给 const,但反之则不行。
  • “const”-ify 访问总是合法的,但反之则不然。如果您具有读/写访问权限,则可以不使用写入部分并保持只读状态。但是如果你只有读权限,你就不能申请写权限。
  • 这是两个不同的常量。一个是低级 const,另一个是顶级 const。
  • 1.指向const 的指针(或引用)只是一个承诺,不会通过该指针/引用修改对象。这并不意味着该对象是不可修改的。 2.int *const是一个常量指针(不能重新赋值指针指向别的东西),而不是指向const的指针。
  • 所以你会认为const int n = 5; int *const p = &n; 是合法的吗?不, const 在哪里很重要。指向 int 的常量指针。当然你可以用 gvalue 初始化一个常量

标签: c++ pointers constants type-mismatch


【解决方案1】:

在这种情况下,存在类型不匹配

没有;在这种情况下没有类型不匹配。它是一个指向 non-cost 的指针,你用指向 non-const 的指针初始化它。

或者,如果你坚持存在“不匹配”,那么它类似于以下“不匹配”:

const int b = 42;

为什么第二种情况有效

简单地说:初始化器的常量与它是否初始化一个常量对象无关。此外,初始化器是非类类型的纯右值,因此 const 限定甚至不适用于它。

【讨论】:

  • 我在另一个答案中提到了这一点,但是将这个问题作为重复问题关闭而不是回答它不是更好吗?
  • @cigien 如果您发现重复,请随时投票关闭。
  • 对不起,让我澄清一下。鉴于您对 c++ 标记中 SO 内容的了解,我相信您可以在编写答案的同时找到副本,并且使用您的 c++ 锤子您可以自己关闭问题。这不是比有很多相同的问题更好吗?
  • @cigien,是什么阻止你这样做?
  • @NicolasDusart 没有什么能阻止我。我什至可以将其作为 eeorika 回答的目标的副本关闭,因为他们之前已经多次回答过这个问题。确实,寻找目标比简单地回答一个简单的问题更难,但我希望我可以说服高级用户,让他们相信努力寻找目标而不是重复回答这样的基本问题是有好处的。尽管如此,如果某些用户的优先级不同,则没有任何规则可以阻止以这种方式行事。
【解决方案2】:

首先,int *const 确实表示指向非 const int 的 const 指针。所以指针和指针类型之间绝对没有类型不匹配。

其次,您始终可以将非 const 变量的地址转换为指向 const 的指针。所以这也是有效的:

int n = 5;
const int * p = &n;

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-02-23
    • 2016-01-16
    • 1970-01-01
    • 2020-10-23
    • 2011-03-27
    • 2012-04-22
    相关资源
    最近更新 更多