2011-06-21 53 views
5

可能重复:
why isnt it legal to convert (pointer to pointer to non-const) to a (pointer to pointer to a const)为什么不能INT **转换成const int的**在C++

您好我有下面的代码,但不能换我周围为什么这头不起作用 - 我得到一个错误,说“不能从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; 
} 
+5

请参阅[“为什么我的转换Foo **→Foo常量**”出错?](http://www.parashift.com/c++-faq-lite/const-correctness.html#faq- 18.17) –

+0

因为它实际上允许你违反const正确性。我会尽力找到dup。 –

+0

我从来没有意识到这是一个很受欢迎的问题,在我看到的所有答案中,我感觉[标准之一](http://stackoverflow.com/a/29240053/1708801)是最好的。 –

回答

1

编辑:

您违反了常量,正确性。通过说你想要一个指针指针,你可以通过允许修改原始的const对象来设置自己。 Const是一个合同。通过在没有强制转换的情况下允许发生这种情况,您正在设置自己以允许稍后修改const对象。

+1

您始终可以将非''constst'转换为'const'。请阅读@James McNellis的链接,了解为什么这个特定场景将'const'转换为非''constst''。 –

+0

(引用0A0D的注释)如果我将函数参数改为“const int * const * myArray”,也是如此,不是吗?如果我这样做,它会很愉快地编译 –

+0

@ 0A0D:我不明白你的意思。你可以做'void something(int * foo){const int bar = * foo; ''整天。 –

6
  • int **是:“指向指向整数的指针”。
  • const int **是:“一个指向常量整数指针的指针”。

牵强的比喻:

  • 描述另一个值得注意的是描述一个罐子
  • 描述另一个值得注意的描述位置的位置记下位置的位置记的一个已关闭瓶子

您只能将cookie放入未关闭的jar中。

现在,想想用第一个音符的影印替换第二个音符。你有任何保证,说明这个笔记指向的最终罐子将被关闭,不能接受任何饼干?使用const是一个合同,你不能通过两个引用的间接符合这个合同。

+0

最好用代码解释这个,而不是jar和cookie。 jar和cookie不是C++的语义,所以如果有类似的话就很难看出这个缺陷。 – Nawaz

+0

@Nawaz:大多数人觉得很难围绕指针来思考,所以我认为一个有形的例子会有所帮助。我有点遗留给其他回答者用代码术语表示...... –

+3

饼干肯定比指针更美味。 –

1

基本上,这是因为它可以通过改变间接的级别和其他有效的,非常量违反的语义来解决,如果它只在最上层,你可以解决这个问题。您必须在多个级别上添加const以使const实际上安全。