从int **到const int的转换无效**

时间:2012-05-04 03:42:41

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

我有一个类,其中一个二维数组的int实现为int **。我按如下方式为这个2D数组实现了一个访问器函数,返回一个const int **以防止用户编辑它:

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

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

2 个答案:

答案 0 :(得分:6)

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!

答案 1 :(得分:4)

我错误地认为该方法的const是导致错误的原因。正如Ben指出的那样,该方法的const - ness是无关紧要的,因为它仅适用于指向int s的指针的外部指针的值,可以将其复制到可变版本平凡。

为了保护数据(这是您的首选结果),您应该使int和指向int的指针保持不变:

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

会工作。

如果您希望将const设置在前面,您也可以像这样编写声明:

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

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