¿El siguiente código es legal, obsoleto o ilegal en C++ 0x?Asignación de literales de cadena a char *
char* p = "foobar";
Originalmente hice esta pregunta here como un comentario.
¿El siguiente código es legal, obsoleto o ilegal en C++ 0x?Asignación de literales de cadena a char *
char* p = "foobar";
Originalmente hice esta pregunta here como un comentario.
La conversión
char* p = "foobar";
está en desuso en C++ 98/C++ 03, y se ha eliminado (es decir, § 4.2/2 eliminados) en C++ 0x.
Por lo tanto, el código es no válido en C++ 0x.
Sin embargo, MinGW g ++ 4.4.1 solo emite una advertencia, no un error.
C++ 98/C++ 03 § 4.2/2 (que se elimina en C++ 0x):
Una cadena literal (2.13.4) que no es una lata literal amplia cadena se convierta en un valor de r del tipo "puntero achar
"; un literal de cadena amplio se puede convertir a un valor de r del tipo "puntero awchar_t
". En cualquier caso, el resultado es un puntero al primer elemento de la matriz. Esta conversión se considera solo cuando hay un tipo de destino de puntero apropiado explícito, y no cuando hay una necesidad general de convertir de un valor l a un valor r. [Nota: esta conversión está en desuso Ver el Anexo D.] Con el propósito de clasificar en resolución de sobrecarga (13.3.3.1.1), esta conversión se considera una conversión de matriz a punta seguido por una conversión de calificación (4.4). [Ejemplo:"abc"
se convierte en "puntero aconst char
" como una conversión de matriz a puntero, y luego a "puntero achar
" como una conversión de calificación. ]
Incluso g ++ 4.4.5 con '-std = C++ 0x' solo emite una advertencia. –
Así que §4.2/2 fue originalmente sobre la conversión literal de cadena a 'char *', supongo? Sería bueno si pudiera incluir ese párrafo del estándar C++ 03 como una cita, si es posible :) – fredoverflow
@Fred: Agregué el párrafo de C++ 03. @Alf: espero que esté bien con usted. – sbi
Creo que esto ahora es ilegal en C++ 0x. C++ 03 tenía una advertencia especial para esta conversión de código heredado, pero C++ 0x lo eliminó y ahora está violando la corrección const.
Por supuesto, no sé si algún compilador real lo haya eliminado, pero estarían dentro de sus derechos.
Continúa funcionando y sigue siendo un estilo pobre. –
GCC 4.6 dice "conversión obsoleta de cadena constante a char *". –
bien, debería ser 'const char *', para ser más correcto –