2013-05-28 133 views
5

非const參數所以我有這樣的代碼:與初始化字符串字面

class ConstTest { 
public: 
    explicit ConstTest(char* name) {} 
}; 

int main() { 
    ConstTest t("blarghgh"); 
} 

這顯然compiles,即使我認爲它不應該。由於C++中的字符串文字的類型爲const char[],而ConstTest的構造函數需要一個常量爲char*而不是const char*。並且將const指針指向非const指針通常不是由C++隱式執行的。

那麼,我錯了?爲什麼要編譯?我可以合法修改構造函數中的取消引用的指針嗎?!

+0

相關:http://stackoverflow.com/questions/10268705/c-why-is-it-possible-to-assign-a-const-char-to-a-char – ulidtko

回答

5

那麼,我錯了?爲什麼要編譯?

這是因爲編譯你的編譯器過於寬鬆,而你的編譯器過於寬鬆,因爲在C++ 03的隱式轉換,從一個字串char*只有棄用,不是無效。

基本原理是與傳統C API向後兼容。每一段的C++ 03標準的4.2/2:

字符串文字(2.13.4),其不是一個寬字符串文字可以被轉換成類型的「指針 char」右值;寬字符串文字可以轉換爲類型爲「指向wchar_t的指針」的右值。在任一情況下, 結果是指向數組的第一個元素的指針。只有在存在明確適當的指針目標類型時纔會考慮此轉換,而不是在通常需要將左值轉換爲 右值時。 [注意:此轉換已被棄用。見附錄D.]

在C++ 11,然而,隱式轉換是非法的(上面的段落已經完全去除)。

我可以合法地取消引用和修改構造函數中的指針嗎?!

可以,但不能修改解除引用的對象。這樣做會是未定義的行爲,因爲該對象的類型是const -qualified。

+0

是的,我其實是訪問解除引用的對象。感謝你的回答! – ulidtko

+0

@ulidtko:好的,很高興幫助。如果這回答你的問題,請考慮將它標記爲接受,當你被允許:) –