Dies könnte eine Anfängerfrage sein und zu verstehen, wie Cout funktioniert, ist hier wohl der Schlüssel. Wenn sich jemand mit einer guten Erklärung verbinden könnte, wäre das großartig.
cout<<cout
und cout<<&cout
drucken Hex-Werte, getrennt durch 4 auf einer Linux x86-Maschine.
cout << cout
entspricht cout << cout.operator void *()
. Dies ist das Idiom, das vor C ++ 11 verwendet wurde, um festzustellen, ob ein Iostream in einem Fehlerzustand ist, und wird in std::ios_base
; es gibt normalerweise die Adresse von static_cast<std::ios_base *>(&cout)
zurück.
cout << &cout
gibt die Adresse von cout
aus.
Da std::ios_base
eine virtuelle Basisklasse von cout
ist, muss sie nicht unbedingt mit cout
zusammenhängen. Deshalb gibt es eine andere Adresse aus.
cout << cout
verwendet die integrierte Umwandlung in void*
, die für boolesche Testzwecke existiert. Aus irgendeinem uninteressanten Grund verwendet Ihre Implementierung eine Adresse, die 4 Bytes in das Objekt std::cout
ist. In C ++ 11 wurde diese Konvertierung entfernt und sollte nicht kompiliert werden.
cout << &cout
gibt die Adresse des std::cout
-Objekts aus.
Wie bereits erwähnt, verwendet cout << cout
die für Bool-Tests vorgesehene void*
-Konvertierung ( while (some_stream){ ... }
, etc.)
Es wird der Wert & amp; cout + 4 ausgegeben, da die Konvertierung in der Basisimplementierung erfolgt und in einen eigenen Typ umgewandelt wird. Dies ist von libstdc ++ :
%Vor%