2011-06-27 12 views
6

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.

+3

To nadal działa i nadal jest kiepski styl. –

+0

W GCC 4.6 napisano "przestarzałą konwersję ze stałej łańcuchowej na char *". –

+0

cóż, to powinno być 'const char *', aby być bardziej poprawnym –

Odpowiedz

14

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 do char"; szeroki ciąg literału można przekonwertować na wartość rinus typu "wskaźnik do wchar_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 na const char" jako konwersja tablica do wskaźnika, a następnie na "wskaźnik do char" jako konwersja kwalifikacji. ]

+0

Nawet g ++ 4.4.5 z '-std = C++ 0x' emituje tylko ostrzeżenie. –

+0

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

+1

@Fred: Dodałem akapit z C++ 03. @Alf: Mam nadzieję, że jest OK z tobą. – sbi

2

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.

Powiązane problemy