2010-08-25 10 views
8

Soy plenamente consciente de que el valor de retorno de std::type_info::name() está definido por la implementación.¿Por qué no se especifica type_info :: name()?

Desde el estándar de C++ (ISO/IEC 14882: 2003 §18.5.1.7):

devoluciones: un NTBS definido por la implementación.

Mi pregunta es: ¿por qué? ¿No sería esta función miembro mucho más útil si el estándar dictó cuál debería ser el valor de retorno?

+0

+1 para esta curiosidad. Supongo que la respuesta es dar algo de latitud a los compiladores, supongo. – Chubsdad

+0

Como NO PUEDE mezclar binarios entre compiladores, siempre que sea coherente con el compilador, no es un gran problema. –

Respuesta

4

Básicamente, si una implementación decide que no pueden o no quieren admitir RTTI, pueden simplemente return "";. Si el estándar lo obligara a devolver algo, posiblemente mataría cualquier posibilidad de tener un compilador compatible para un entorno donde los recursos para RTTI no existen o desea ser deshabilitado (un microchip, por ejemplo).

Y no olvidemos que no queremos forzar un esquema de ABI/manipulación de nombres en ningún compilador.

Esto sigue la filosofía C++ "No paga por cosas que no necesita".

+0

+1 para el argumento RTTI. ¿Pero no podría el estándar dictar algo como * devolver el nombre no marcado del tipo dinámico si se admite RTTI y del tipo estático si no es así *? – Job

+0

@Job: Posiblemente, pero ¿cómo se formatea el nombre del tipo? ¿Y dónde está almacenada la cuerda? Estoy de acuerdo en que sería bueno tener un resultado de 'nombre()' coherente o al menos confiable, pero no especificado es lo mejor que se puede hacer, dada la naturaleza de los compiladores. (Cómo manejan los tipos es su negocio, y no podemos estar seguros de cómo lo están manejando y cuál es la plataforma de destino, y si eso permite un resultado significativo de 'nombre()'). – GManNickG

+1

Creo que '0' isn No es un NTBS válido, entonces tal implementación debería al menos 'devolver ''. – sbi

2

Cuando hablamos de proveedores que devuelven cadenas diferentes, creo que es solo un "lo hacemos de esta manera, usted cambia" "no, lo hacemos de esta manera, USTED cambia" entre los proveedores del compilador. Incluso el comité de Estándares no quiere molestar a los equipos de compilación, y crear un nuevo estándar neutral que no sea empleado por ningún proveedor tiende a significar encontrar algo que no tenga sentido de todos modos.

¿Por qué ya no son todos los espacios de nombres obvios :: clase :: funciones, etc.? Algunas implementaciones actuales pueden haber encontrado históricamente conveniente que coincida con los nombres de los usuarios desquiciados, paranoicos (o clientes paranoicos), uso de la memoria, etc.

Cuestiones relacionadas