Czy poniższy kod jest legalny, przestarzały lub nielegalny w C++ 0x?Przypisywanie literałów łańcuchowych do znaków *
char* p = "foobar";
Pierwotnie zadałem to pytanie here jako komentarz.
Czy poniższy kod jest legalny, przestarzały lub nielegalny w C++ 0x?Przypisywanie literałów łańcuchowych do znaków *
char* p = "foobar";
Pierwotnie zadałem to pytanie here jako komentarz.
Konwersja
char* p = "foobar";
jest przestarzała C 98/C++ ++ 03 i został usunięty (to znaczy §4.2/2 usunięty) C++ 0x.
Kod jest zatem niepoprawny w C++ 0x.
Jednak MinGW g ++ 4.4.1 nadal wysyła tylko ostrzeżenie, a nie błąd.
C++ 98/C++ 03 §4.2/2 (który jest usunięty C++ 0x)
Łańcuch znaków (2.13.4), która jest szeroka Łańcuch znaków puszki zostać przekonwertowane na wartość rinalną typu "wskaźnik dochar
"; szeroki ciąg literału można przekonwertować na wartość rinus typu "wskaźnik dowchar_t
". W obu przypadkach wynikiem jest wskaźnik do pierwszego elementu tablicy. Ta konwersja jest rozważana tylko wtedy, gdy istnieje wyraźny odpowiedni docelowy typ wskaźnika, a nie wtedy, gdy istnieje ogólna potrzeba konwersji z lwartości do wartości r. [Uwaga: ta konwersja jest przestarzała. Patrz załącznik D.] W celu uszeregowania w rozdzielczości przeciążenia (13.3.3.1.1), konwersja ta jest uważana za konwersję między tablicami a po konwersji kwalifikacji (4.4). [Przykład:"abc"
jest konwertowany na "wskaźnik naconst char
" jako konwersja tablica do wskaźnika, a następnie na "wskaźnik dochar
" jako konwersja kwalifikacji. ]
Nawet g ++ 4.4.5 z '-std = C++ 0x' emituje tylko ostrzeżenie. –
Więc § 4.2/2 był pierwotnie o dosłownym ciągu do konwersji "char *", jak sądzę? Byłoby fajnie, gdybyś mógł dołączyć ten akapit ze standardu C++ 03 jako wyceny, jeśli to możliwe :) – fredoverflow
@Fred: Dodałem akapit z C++ 03. @Alf: Mam nadzieję, że jest OK z tobą. – sbi
Uważam, że jest to teraz nielegalne w C++ 0x. C++ 03 miało specjalne zastrzeżenie dla tej konwersji dla starszego kodu, ale C++ 0x usunęło go, a teraz łamiecie stałą poprawność.
Oczywiście, nie wiem, czy prawdziwe kompilatory usunęły go, ale byłyby dobrze w swoich prawach.
To nadal działa i nadal jest kiepski styl. –
W GCC 4.6 napisano "przestarzałą konwersję ze stałej łańcuchowej na char *". –
cóż, to powinno być 'const char *', aby być bardziej poprawnym –