¿Cuál es la diferencia entre cout << cout y cout << & cout en c ++?

Esta podría ser una pregunta para principiantes y entender cómo funciona Cout es probablemente la clave aquí. Si alguien pudiera relacionarse con una buena explicación, sería genial. cout<<cout and cout<<&cout imprime valores hexadecimales separados por 4 en una máquina linux x86.

cout << cout es equivalente a cout << cout.operator void *() . Este es el idioma utilizado antes de C ++ 11 para determinar si un iostream está en un estado de falla, y se implementa en std::ios_base ; normalmente devuelve la dirección de static_cast(&cout) .

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

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

cout << cout está usando la conversión incorporada a void* que existe para propósitos de prueba booleana. Por alguna razón 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 no se debería comstackr.

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

cout << &cout es pasar cout la dirección de cout .

cout << cout está imprimiendo el valor de lanzar implícitamente cout a un puntero void* usando su operator void* .

Como ya se dijo, cout << cout usa la conversión void* proporcionada para bool testing ( while (some_stream){ ... } , etc.)

Imprime el valor & cout + 4 porque la conversión se realiza en la implementación base y se convierte en su propio tipo, esto es de libstdc ++ :

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

cout<<&cout es pasar la dirección de cout a la transmisión.