2011-09-20 33 views
8

Esto podría ser una pregunta para principiantes y entender cómo funciona cout es probablemente la clave aquí. Si alguien pudiera vincular a una buena explicación, sería genial. cout<<cout y cout<<&cout imprime valores hexadecimales separados por 4 en una máquina linux x86.¿Cuál es la diferencia entre cout << cout y cout << y cout en C++?

+0

Aquí hay un ejemplo para las personas. http://ideone.com/0FZXZ –

+1

¿Qué es realmente * is * the question? – Puppy

+3

¿Por qué estás preguntando esto? La pregunta no tiene ningún sentido, no es lógica hacerlo. –

Respuesta

16

cout << cout es equivalente a cout << cout.operator void *(). Esta es la expresión utilizada antes de C++ 11 para determinar si una iostream está en un estado de falla y se implementa en std::ios_base; generalmente devuelve la dirección de static_cast<std::ios_base *>(&cout).

cout << &cout imprime la dirección de cout.

Dado que std::ios_base es una clase base virtual de cout, puede no ser necesariamente contigua a cout. Es por eso que imprime una dirección diferente.

0

cout<<&cout está pasando la dirección de cout a la corriente.

4

cout << &cout está pasando cout la dirección de cout.

cout << cout está imprimiendo el valor de fundición implícitamente cout a un puntero void* utilizando su operator void*.

+0

El enlace está roto. – Destructor

+0

Quité el enlace porque no pude encontrar un reemplazo adecuado. Gracias – GWW

5

cout << cout está utilizando la conversión incorporada a void* que existe con fines de prueba booleanos. Por algún motivo poco interesante, su implementación usa una dirección de 4 bytes en el objeto std::cout. En C++ 11 esta conversión se eliminó, y esto no debería compilarse.

cout << &cout está imprimiendo la dirección del objeto std::cout.

3

Como ya se ha dicho, cout << cout utiliza la conversión void* prevista para la prueba bool (while (some_stream){ ... }, etc.)

Se imprime el valor & cout + 4 porque la conversión se realiza en la implementación base, y pone a su propio tipo, esto es from libstdc++:

operator void*() const 
{ return this->fail() ? 0 : const_cast<basic_ios*>(this); }