【问题标题】:Invalid conversion from int** to const int**从 int** 到 const int** 的无效转换
【发布时间】:2012-05-13 14:51:03
【问题描述】:

我有一个类,其中包含一个以 int** 实现的二维整数数组。我为这个二维数组实现了一个访问器函数,如下所示,返回一个 const int** 以防止用户对其进行编辑:

const int** Class::Access() const
{
     return pp_array;
}

但我收到编译错误“从 int** 到 const int** 的无效转换”。为什么这里不允许对 const 的提升?如何在没有编辑权限的情况下授予用户访问信息的权限?

【问题讨论】:

  • 注意:你的变量名不能以数字开头。
  • 对,它实际上并没有出现在代码中,这只是我在概括名称时的疏忽 - 现在已编辑 :)
  • 封装一维向量的矩阵类也可以很好地保存数据。比二维指针数组好得多。它还消除了诸如此类的混淆。
  • 您是否也收到“...丢弃限定符...”错误消息?
  • 不幸的是我还没有学过向量...

标签: c++ constants implicit-conversion multiple-indirection


【解决方案1】:

Greyson 是正确的,你会想使用 const int* const*,但没有解释为什么你的原始版本失败了。

这里演示为什么int**const int**不兼容:

const int ci = 0;
const int* pci = &ci;
int* pi;
int** ppi = π
const int** ppci = ppi; // this line is the lynchpin
*ppci = pci;
*pi = 1; // modifies ci!

【讨论】:

  • 虽然这是正确的,但它没有解决在这种情况下 int** 需要为 const 的原因;该方法的“常量”特性是为什么返回指向整数的可变指针是关键。
  • @Greyson:方法的const-ness 没有区别,没有人写pp_array = anything。我刚刚添加的新措辞解释了为什么你的推理完全错误。
  • 如果没有 const-ness 的方法,int const ** 的返回规范很好。
  • @Greyson:使用const 方法,int** 的返回规范仍然可以。我解释了原因。但是,他想返回一个只读指针,即int const **,但必须从外向内添加const。另外,你有没有看警告信息?
  • 我有点困惑 - 我明白你的意思是 int** 无法转换为 const int** 因为它与指向的 int 的 const 性相混淆。但是在您的代码中,什么时候说 pi 指向 ci?
【解决方案2】:

我误认为方法的constness 是错误的原因。正如 Ben 所指出的,该方法的 const-ness 是无关紧要的,因为它仅适用于外部指针 [指向 ints 的指针] 的值,可以轻松地将其复制到可变版本。

为了保护数据(这是您的首选结果),您应该将 ints 和指向 ints 的指针都设为常量:

int const * const * Class::Access() const
{
   return pp_array;
}

会起作用的。

如果你更喜欢 const 在前面,你也可以这样写声明:

const int * const * Class::Access() const;

但由于第二个const 应用于指针,它必须放在星号的右侧(如应用于方法的const)。

【讨论】:

  • 为什么 const 在 int 之前被删除了?此处指向的数据是否仍然不变?
  • @BugalugsNash,从右到左阅读。 int 仍然是 const。但是,如果 const 左侧没有任何内容,则适用于右侧。
  • int 之前/之后的 const 是相同的。当相对于“*”符号移位时,它会改变含义
  • @AdityaKumar 除了'consts'必须指针的星星之后;所以我这样写是为了保持一致。
  • @BugalugsNash:我刚刚输入了自己的答案。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-01-05
  • 2012-03-30
相关资源
最近更新 更多