【问题标题】:Learning C++: why is this illegal?学习 C++:为什么这是非法的?
【发布时间】:2017-09-10 13:34:23
【问题描述】:

几天前我买了一本 C++ Primer 书,开始学习这门新语言!

目前,我正试图弄清楚为什么我自己写的这个块是非法的:

我将一个 const int 初始化为 512; 我初始化一个指向 n 的 const int const 指针; 但它不允许我创建一个指向指针的 const int const 指针,即使正确使用双 ** 和一切:

const signed int n = 512;
const signed int *const nPointer = & n;
const signed int **const nPointer2 = & nPointer;

有人有简单的解释吗?感谢您的宝贵时间!

【问题讨论】:

  • 你遇到了什么错误?
  • 最后一行,一个const放错地方了:const signed int * const * nPointer2 = & nPointer;nPointer2是不是const都没有关系(也就是可以做成指向某事否则)-重要的是它指向的是const
  • 哦,谢谢,现在我明白了!
  • 编译器在其错误消息中告诉您为什么这是非法的。确实,C++ 编译器的错误消息以完全令人困惑和难以理解而著称。尽管如此,必须学习如何阅读和理解 C++ 编译器错误消息。如果每次遇到编译错误都必须在 stackoverflow.com 上发布问题,那么学习 C++ 将花费你一生的时间。现在您了解了问题所在,请返回并重新阅读编译器的原始消息,并继续重新阅读它,直到它对您有意义为止。

标签: c++ pointers


【解决方案1】:

要修复代码,您有两种选择:

//Option one : 
const signed int *const nPointer = & n;
const signed int *const *const nPointer2 = & nPointer;
//Option two :
const signed int * nPointer = & n;
const signed int **const nPointer2 = & nPointer;

解释:

当 nPointer 是一个指向 T 的常量指针时,nPointer2 应该指向一个指向 T 的常量指针,就像在第一个选项中一样。或者,当 nPointer2 是指向 T 的非常量指针的指针时,指针对象 nPointer 也应该是非常量。

当你到达本书的定义你自己的类型别名的部分时,你可以消除混乱,看看这些替代方案是如何工作的:

//simplifying notation:
using myType = const signed int *;
using myTypeC = const signed int * const;

//your code equivalent to:
myTypeC nPointer = & n;
myType *const nPointer2 = & nPointer;

//Option One:    
myTypeC nPointer = & n;
myTypeC *const nPointer2 = & nPointer;
//Option Two:    
myType nPointer = & n;
myType *const nPointer2 = & nPointer;

【讨论】:

    【解决方案2】:

    先简化问题,去掉签名。问题依旧 其次,使用编译器并阅读错误消息。这对所有语言都有效,不仅是 C++ 问题出在这里:

    const int **const nPointer2 = & nPointer;
    

    nPointer 类型是 const signed int* const

    你的指示是

    const signed int **const nPointer2 = & nPointer;
    

    所以您会收到以下消息:

    错误:从 'const int* const*' 到 'const int**' 的无效转换

    如您所见, const 在您的两颗星之间。创建编译错误。

    如您所见,使用 & 将 * 放在 结束

    【讨论】:

      猜你喜欢
      • 2014-09-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-03-09
      • 1970-01-01
      • 2014-03-05
      • 2018-12-13
      • 1970-01-01
      相关资源
      最近更新 更多