operator<<(std::basic_ostream)
Von de.cppreference.net
| Definiert in Header <ostream>
|
||
basic_ostream und Zeichen |
||
template< class CharT, class Traits >
basic_ostream<CharT, Traits>&
operator<<( basic_ostream<CharT, Traits>& os, CharT ch );
template< class CharT, class Traits >
basic_ostream<CharT, Traits>&
operator<<( basic_ostream<CharT, Traits>& os, char ch );
template< class Traits >
basic_ostream<char, Traits>&
operator<<( basic_ostream<char, Traits>& os, char ch );
template< class Traits >
basic_ostream<char, Traits>&
operator<<( basic_ostream<char, Traits>& os, signed char ch );
template< class Traits >
basic_ostream<char, Traits>&
operator<<( basic_ostream<char, Traits>& os, unsigned char ch );
|
(1) | |
basic_ostream und Zeichenarray |
||
template< class CharT, class Traits >
basic_ostream<CharT, Traits>&
operator<<( basic_ostream<CharT, Traits>& os, const CharT* s );
template< class CharT, class Traits >
basic_ostream<CharT, Traits>&
operator<<( basic_ostream<CharT, Traits>& os, const char* s );
template< class Traits >
basic_ostream<char, Traits>&
operator<<( basic_ostream<char, Traits>& os, const char* s );
template< class Traits >
basic_ostream<char, Traits>&
operator<<( basic_ostream<char, Traits>& os, const signed char* s );
template< class Traits >
basic_ostream<char, Traits>&
operator<<( basic_ostream<char, Traits>& os, const unsigned char* s );
|
(2) | |
basic_ostream rvalue |
||
template< class Ostream, class T >
Ostream&& operator<<( Ostream&& os, const T& value );
|
(3) | (seit C++11) |
| Gelöschte Überladungen für basic_ostream und UTF-Zeichen/-Array |
||
template< class Traits >
basic_ostream<char, Traits>&
operator<<( basic_ostream<char, Traits>& os, wchar_t ch ) = delete;
template< class Traits >
basic_ostream<char, Traits>&
operator<<( basic_ostream<char, Traits>& os, char8_t ch ) = delete;
template< class Traits >
basic_ostream<char, Traits>&
operator<<( basic_ostream<char, Traits>& os, char16_t ch ) = delete;
template< class Traits >
basic_ostream<char, Traits>&
operator<<( basic_ostream<char, Traits>& os, char32_t ch ) = delete;
template< class Traits >
basic_ostream<wchar_t, Traits>&
operator<<( basic_ostream<wchar_t, Traits>& os, char8_t ch ) = delete;
template< class Traits >
basic_ostream<wchar_t, Traits>&
operator<<( basic_ostream<wchar_t, Traits>& os, char16_t ch ) = delete;
template< class Traits >
basic_ostream<wchar_t, Traits>&
operator<<( basic_ostream<wchar_t, Traits>& os, char32_t ch ) = delete;
template< class Traits >
basic_ostream<char, Traits>&
operator<<( basic_ostream<char, Traits>& os, const wchar_t* s ) = delete;
template< class Traits >
basic_ostream<char, Traits>&
operator<<( basic_ostream<char, Traits>& os, const char8_t* s ) = delete;
template< class Traits >
basic_ostream<char, Traits>&
operator<<( basic_ostream<char, Traits>& os, const char16_t* s ) = delete;
template< class Traits >
basic_ostream<char, Traits>&
operator<<( basic_ostream<char, Traits>& os, const char32_t* s ) = delete;
template< class Traits >
basic_ostream<wchar_t, Traits>&
operator<<( basic_ostream<wchar_t, Traits>& os, const char8_t* s ) = delete;
template< class Traits >
basic_ostream<wchar_t, Traits>&
operator<<( basic_ostream<wchar_t, Traits>& os, const char16_t* s ) = delete;
template< class Traits >
basic_ostream<wchar_t, Traits>&
operator<<( basic_ostream<wchar_t, Traits>& os, const char32_t* s ) = delete;
|
(4) | (seit C++20) |
Fügt ein Zeichen oder eine Zeichenkette ein.
1) Verhält sich wie eine FormattedOutputFunction. Nach der Konstruktion und Prüfung des sentry-Objekts wird das Zeichen
ch eingefügt. Wenn ch den Typ char hat und der Zeichencontainer-Typ von os nicht char ist, wird stattdessen os.widen(ch) eingefügt. Die Auffüllung wird wie folgt bestimmt:
- Wenn
os.width() > 1, dann werdenos.width() - 1Kopien vonos.fill()zum Ausgabezeichen hinzugefügt, um die Ausgabezeichensequenz zu bilden. - Wenn
(out.flags() & std::ios_base::adjustfield) == std::ios_base::left, werden die Füllzeichen nach dem Ausgabezeichen platziert, andernfalls davor.
Nach der Einfügung wird
os.width(0) aufgerufen, um die Auswirkungen von std::setw zu annullieren, falls vorhanden.
2) Verhält sich wie eine FormattedOutputFunction. Nach der Konstruktion und Prüfung des Sentry-Objekts werden aufeinanderfolgende Zeichen aus dem Zeichenarray eingefügt, dessen erstes Element von
s referenziert wird.
- Für die erste und dritte Überladung (wo
CharTmit dem Typ vonchübereinstimmt), werden genautraits::length(s)Zeichen eingefügt. - Für die zweite Überladung werden genau
std::char_traits<char>::length(s)Zeichen eingefügt. - Für die letzten beiden Überladungen werden genau
traits::length(reinterpret_cast<const char*>(s))eingefügt.
Vor der Einfügung werden zunächst alle Zeichen mit
os.widen() verbreitert, dann wird die Auffüllung wie folgt bestimmt:
- Wenn die Anzahl der einzufügenden Zeichen kleiner als
os.width()ist, werden genügend Kopien vonos.fill()zur Zeichensequenz hinzugefügt, um ihre Längeos.width()gleich zu machen. - Wenn
(out.flags() & std::ios_base::adjustfield) == std::ios_base::left, werden die Füllzeichen am Ende der Ausgabesequenz hinzugefügt, andernfalls werden sie vor der Ausgabesequenz hinzugefügt.
Nach der Einfügung wird
os.width(0) aufgerufen, um die Auswirkungen von std::setw zu annullieren, falls vorhanden. Wenn
s ein Nullzeiger ist, ist das Verhalten undefiniert.
3) Ruft den entsprechenden Einfügeoperator auf, gegeben eine Rvalue-Referenz auf ein Ausgabestromobjekt (äquivalent zu
os << value). Diese Überladung nimmt nur an der Überladungsauflösung teil, wenn der Ausdruck os << value wohlgeformt ist und Ostream ein Klassentyp ist, der öffentlich und eindeutig von std::ios_base abgeleitet ist.
4) Überladungen, die
char16_t, char32_t usw. (oder eine nullterminierte Sequenz davon) akzeptieren, sind gelöscht: std::cout << u'X' ist nicht erlaubt. Zuvor würden diese einen Ganzzahl- oder Zeigerwert ausgeben.Parameter
| os | - | Ausgabestream, in den Daten eingefügt werden |
| ch | - | Referenz auf ein einzufügendes Zeichen |
| s | - | Zeiger auf eine einzufügende Zeichenkette |
Rückgabewert
1,2)
os
3)
std
::
move
(
os
)
Hinweise
Vor LWG Issue 1203 konnte Code wie ( std:: ostringstream ( ) << 1.2 ) . str ( ) nicht kompiliert werden.
Beispiel
Diesen Code ausführen
#include <fstream> #include <iostream> void foo() { // Fehler: operator<< (basic_ostream<char, _Traits>&, char8_t) ist gelöscht // std::cout << u8'z' << '\n'; } std::ostream& operator<<(std::ostream& os, char8_t const& ch) { return os << static_cast<char>(ch); } int main() { std::cout << "Hello, world" // verwendet `const char*` Überladung << '\n'; // verwendet `char` Überladung std::ofstream{"test.txt"} << 1.2; // verwendet Rvalue-Überladung std::cout << u8'!' << '\n'; // verwendet programmdefinierten operator<<(os, char8_t const&) }
Ausgabe:
Hello, world !
Fehlerberichte
Die folgenden verhaltensändernden Fehlerberichte wurden rückwirkend auf zuvor veröffentlichte C++-Standards angewendet.
| DR | Angewendet auf | Verhalten wie veröffentlicht | Korrektes Verhalten |
|---|---|---|---|
| LWG 167 | C++98 |
die Anzahl der eingefügten Zeichen für alle
Überladungen in (2) war traits :: length ( s ) |
aktualisierte die Zahlen für die Überladungen
bei denen
CharT
nicht mit dem Typ von
ch
übereinstimmt
|
| LWG 1203 | C++11 |
Überladung für Rvalue-Stream gab
Lvalue-Referenz auf die Basisklasse zurück |
gibt Rvalue-Referenz
auf die abgeleitete Klasse zurück |
| LWG 2011 | C++98 | Auffüllen wurde bestimmt durch std::num_put::do_put() | bestimmt durch den Operator selbst |
| LWG 2534 | C++11 | Überladung für Rvalue-Stream war nicht eingeschränkt | eingeschränkt |
Siehe auch
|
formatiert Daten ein
(öffentliche Elementfunktion) |
|
|
(C++23)
|
gibt
formatierte
Darstellung der Argumente aus
(Funktions-Template) |
|
erweitert Zeichen
(öffentliche Elementfunktion von
std::basic_ios<CharT,Traits>
)
|