2011-06-27 219 views
6

以下代碼在C++ 0x中是否合法,不推薦使用還是非法?將字符串文字分配給char *

char* p = "foobar"; 

我最初問這個問題here作爲評論。

+3

它繼續工作,並繼續是貧窮的風格。 –

+0

GCC 4.6說「從字符串常量到char *的棄用轉換」。 –

+0

好吧,它應該是'const char *',要更正確 –

回答

14

轉換

char* p = "foobar"; 

在C++ 0X棄用在C++ 98/C++ 03,並已被移除(即,§4.2/ 2去除)。

因此,代碼是在C++ 0x中無效

但是,MinGW g ++ 4.4.1仍然只發出警告,而不是錯誤。

C++ 98/C++ 03§4.2/ 2(在C++ 0X移除):


字符串文字(2.13.4),其不是一個寬字符串文字罐被轉換爲類型爲「指向 char」的右值;寬字符串文字可以轉換爲類型爲「指向 wchar_t的指針」的右值。無論哪種情況,結果都是指向數組的第一個元素的指針。只有在存在明確的適當的指針目標類型時纔會考慮這種轉換,而不是當一般需要將左值轉換爲右值時。 [注意:此轉換已被棄用。見附錄D.]爲了在重載分辨率(13.3.3.1.1)中進行排序,此轉換被認爲是一個數組到指針的轉換,然後是一個限定轉換(4.4)。 [示例:將​​轉換爲「指向 const char」的指針作爲數組到指針的轉換,然後指向「指向 char」作爲限定轉換。 ]

+0

即使g ++ 4.4.5和'-std = C++ 0x'也只會發出警告。 –

+0

所以§4.2/ 2最初是關於字符串文字轉換爲char *'的,我想呢?如果可以的話,將C++ 03標準中的段落包含在報價中,如果可能的話,會很酷:) – fredoverflow

+1

@Fred:我在C++ 03中添加了段落。 @阿爾夫:我希望你可以。 – sbi

2

我相信這現在在C++ 0x非法。對於遺留代碼的這種轉換,C++ 03有一個特殊的警告,但是C++ 0x將其刪除,現在您違反了const正確性。

當然,我不知道是否有真正的編譯器已經刪除它,但他們將在他們的權利範圍內。

相關問題