簡體   English   中英

用字符串文字初始化非常量參數

[英]Initializing non-const parameter with string literal

所以我有這段代碼:

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

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

它顯然可以編譯 ,即使我認為不應該編譯 如在C ++字符串文字具有類型const char[]ConstTest構造函數需要一個const少char* -不是const char* 並且將const指針轉換為非const指針通常不是C ++隱式完成的。

所以,我哪里錯了? 為什么要編譯? 我可以合法地修改構造函數內部的取消引用的指針嗎?

所以,我哪里錯了? 為什么要編譯?

之所以進行編譯,是因為您的編譯器太寬松,而您的編譯器太寬松了,因為在C ++ 03中,從字符串文字到char*的隱式轉換僅被棄用 ,而不是無效的。

基本原理是與舊版C API向后兼容。 根據C ++ 03標准的第4.2 / 2段:

可以將不是寬字符串文字的字符串文字(2.13.4)轉換為“ pointer to char ”類型的右值; 寬字符串文字可以轉換為“ wchar_t指針”類型的右值。 無論哪種情況,結果都是指向數組第一個元素的指針。 僅當存在顯式的適當的指針目標類型時才考慮此轉換,而在通常需要從左值轉換為右值時則不考慮這種轉換。 [ 注意 :不建議使用此轉換。 見附件D。

但是,在C ++ 11中,隱式轉換是非法的(上面的段落已被完全刪除)。

我可以合法地取消引用並修改構造函數內部的指針嗎?

您可以但不能修改已取消引用的對象。 這樣做將是未定義的行為,因為對象的類型是const限定的。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM