可能重复:
why isnt it legal to convert (pointer to pointer to non-const) to a (pointer to pointer to a const)
您好我有以下代码,但无法解决为什么这不起作用 - 我得到一个错误说“无法从int **转换为const int **”。但是,如果我将printValues的第一个参数更改为“const int * const * myArray”,那么一切正常。我知道我可能不应该使用下面的那个,但我不明白为什么它根本不编译。你能不能指向一个指向常量整数的指针而不在main()中声明它是常量吗?
#include <iostream>
int printValues(const int ** myArray, const long nRows, const long nCols)
{
for (long iRow = 0; iRow < nRows; iRow++)
{
for (long iCol = 0; iCol < nCols; iCol++)
{
std::cout << myArray[iRow][iCol] << " ";
}
std::cout << "\n";
}
return 0;
}
int main()
{
const long nRows = 5;
const long nCols = 8;
int** myArray = new int* [nRows];
for (long iRow = 0; iRow < nRows; iRow++)
{
myArray[iRow] = new int [nCols];
}
for (long iRow = 0; iRow < nRows; iRow++)
{
for (long iCol = 0; iCol < nCols; iCol++)
{
myArray[iRow][iCol] = 1;
}
}
printValues(myArray, nRows, nCols);
return 0;
}
答案 0 :(得分:6)
int **
是:“指向整数的指针”。const int **
是:“指向常量整数的指针”。一个牵强附会的类比:
您只能将一个cookie放在未关闭的jar中。
现在,考虑用第一个音符的复印件替换第二个音符。您是否保证本说明所指出的最终罐子将被关闭且不能接受任何饼干?使用const
是一个合同,你不能通过两个引用的间接来满足这个合同。
答案 1 :(得分:1)
编辑:
你违反了const-correctness。通过说你想要一个指向指针的指针,你可以通过允许修改原始const对象来设置自己。 Const是一份合同。通过允许在没有强制转换的情况下发生这种情况,您可以自行设置以便稍后修改const对象。
答案 2 :(得分:1)
基本上,这是因为它可以通过改变间接的级别和其他有效的,非违反语义,如果它只在顶层,你可以解决const。你必须在多个级别上添加const才能使const真正安全。