2011-04-25 54 views
3

有人可以解釋爲什麼允許第二次轉換,而第一次轉換不允許?他們都可能允許一個const左值的修改...C++資格轉換 - 常量

double *wPtr; 
const double ** wRef = &wPtr; 
const double * const * wRef = &wPtr; 

謝謝 單組

添加編譯從科莫錯誤...

int main(int argc, const char* argv[]) 
{ 
    double *wPtr; 
    const double ** wRef = &wPtr; 
    return 0; 
} 

Compiling Comeau C/C++ 4.3.10.1 (Oct 6 2008 11:28:09) for ONLINE_EVALUATION_BETA2 
Copyright 1988-2008 Comeau Computing. All rights reserved. 
MODE:strict errors C++ C++0x_extensions 

"ComeauTest.c", line 4: error: a value of type "double **" cannot be used to 
     initialize an entity of type "const double **" 
    const double ** wRef = &wPtr; 
         ^

1 error detected in the compilation of "ComeauTest.c". 
+0

您可以發佈編譯此代碼時得到的錯誤消息的示例嗎?我認爲別的什麼可能會發生...... – Anton 2011-04-25 02:48:33

+0

@antonm:不,他是正確的,第一個構成了一個明確的和編譯器捕獲的錯誤,第二個沒有。他只是沒有第二個的含義。 – 2011-04-25 02:55:06

+0

@尼古拉斯:是的,我現在看到它。有人(你?)發佈了一個答案,我再也看不到了。它有這個有用的鏈接:http://www.parashift.com/c++-faq-lite/const-correctness.html#faq-18.17 – Anton 2011-04-25 03:08:17

回答

2

因爲第二個例子確實而不是允許修改一個常量左值(至少在您沒有付出實際努力的情況下(鑄造,本身往往是危險的跡象))。我不確定你爲什麼這麼做,因爲你不提供進一步的解釋。它說「wRef是一個指向const的指針的double指針」。

您可以修改wRef(指向不同的對象)。您不能修改它指向的值(wPtr指針),也不能修改wPtr指向的值。這不提供修改常數左值的(普通)途徑。

第一個例子當然顯然是危險的,並且不會像您期望的那樣。

順便提一句,如果你還沒有,你應該通讀Const correctness chapter of the C++ FAQ。第17節通過這個具體案例,但主要從第一個不被允許的角度出發,並沒有明確地試圖描述爲什麼第二個被允許。

+1

謝謝你,你的答案和c + + faq鏈接清除了事情。我從錯誤的角度看問題。 – regu 2011-04-25 03:17:35

0

因此,在單詞左邊添加「const」這個詞很容易讓人誤解。

您的第二個陳述將更好地陳述爲double const * *wRef = &wPtr
基本上,這是一個指向const double指針的指針。你可以在這裏修改左值,因爲它是而不是 const - 只有被指向的double是const。

第二個是double const * const * wRef - 即指向常量double的常量指針。
指針指針本身可以改變,但它指向的double必須是const。你不能修改常量左值。