2011-06-27 24 views
6

¿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.

+3

Continúa funcionando y sigue siendo un estilo pobre. –

+0

GCC 4.6 dice "conversión obsoleta de cadena constante a char *". –

+0

bien, debería ser 'const char *', para ser más correcto –

Respuesta

14

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 a char"; un literal de cadena amplio se puede convertir a un valor de r del tipo "puntero a wchar_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 a const char" como una conversión de matriz a puntero, y luego a "puntero a char" como una conversión de calificación. ]

+0

Incluso g ++ 4.4.5 con '-std = C++ 0x' solo emite una advertencia. –

+0

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

+1

@Fred: Agregué el párrafo de C++ 03. @Alf: espero que esté bien con usted. – sbi

2

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.

Cuestiones relacionadas