2011-06-21 108 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實際上安全。