2011-06-08 5 views
6

un código comosalida de la corriente y sin efecto implícito * función operador de conversión invocación

cin>> grade; 

donde grado es un tipo de datos estándar devuelve una referencia a cin (objeto istream) que permite entradas en cascada ....
pero he leído que si

cin >>grade; 

se utiliza como condición decir en un comunicado tiempo ... * función operador de conversión de la corriente nula se llama implícitamente ... y se convierte referencia a istream objeto en un no nulo o puntero nulo dependiendo de success ss o el fracaso de la última operación de entrada ... y puntero nulo convierte a falso y no nulo de verdad ... mis preguntas son:

  1. ¿cuál es la función de operador de conversión * nula y cómo funciona aquí
  2. cómo se puntero no nulo convierte en verdadera y falsa nula a
+0

Solo para observar por qué esto es útil: Te permite hacer un bucle como 'while (cin >> x) {/ * hacer cosas con x * /}'. –

Respuesta

10

1. ¿qué es el vacío * la función de operador de conversión y cómo funciona aquí

se l ooks algo como esto:

operator void*() const { 
    return fail() ? 0 : this; 
} 

La pregunta es: ¿por qué no es una operator bool utilizado aquí? La respuesta es: porque eso permite conversiones no válidas que pueden ocultar errores. Lo anterior es un ejemplo del safe bool idiom.

Sin embargo, esta implementación es realmente obsoleta. Existen mejores implementaciones de este modismo; el articulo los explica.

2.how es puntero no nulo convertido a la verdadera y falsa a la nula

Esto es sólo la forma en C++ funciona: cualquier puntero no nulo se considera equivalente a true en una condicional. Ahora, ¿por qué C++ invoca el operator void* aquí en primer lugar?

Básicamente, cuando C++ ve un objeto de tipo inesperado, intenta aplicar una conversión implícita que haría que el tipo de objeto sea válido en este contexto. Por lo tanto, el compilador prueba todas las conversiones implícitas disponibles y busca si el tipo resultante sería aceptable en este contexto.

Esto le está sucediendo a ella: el compilador ve while (cin >> grade). Sabe que basic_istream no es válido en el contexto de un condicional while. Entonces encuentra que hay un operator void*, y un void*es válido en este contexto por lo que C++ aplica esta conversión.

+0

@Konrad: ¿Esto no es suficiente -> 'return fail()? 0: esto; '? – Nawaz

+0

@Nawaz No estaba seguro, y demasiado perezoso para comprobarlo. ?: prohíbe la conversión implícita entre tipos incompatibles. Quizás el tipo '0' se infiere correctamente como' basic_istream * 'aquí. Pero de cualquier manera, el elenco lo hace explícito. –

+0

@Konrad: Sí. '0' es compatible con cualquier tipo de puntero, debido a la conversión implícita.Esa es la razón por la que a menudo se utiliza como puntero NULL de cualquier tipo. 'std :: istream * p = 0;', 'std :: string * s = 0;', 'void * v = 0;' todo está bien. De todos modos, +1 para una buena respuesta. – Nawaz

Cuestiones relacionadas