std::endl
ひとまずstd::endlについてリファレンス見てみます。
リファレンス:endl - cpprefjp C++日本語リファレンス
ここでは、「改行を出力し、バッファをフラッシュする」という意味で説明しています。
分かりやすく分けると、「改行を出力」「バッファをフラッシュ」となります。
まず、「改行を出力」とは、C言語で改行を行うとき、「"\n"」を使っていたと思いますが、これのことです。
std::endlには、この「"\n"」が含まれており、わざわざ「"\n"」を呼ばなくても改行をするためにstd::endlをよべば済むようになってます。
次に、「バッファをフラッシュ」を説明する為に「std::cout << "test" << std::endl;」を例にします。
std::coutの後に書き起こした「"test"」というのを、出力するためどこかに一時的に保存しておく必要があります。
そのための一時的な記憶領域のことをバッファ(バッファ(緩衝記憶装置)とは - IT用語辞典 e-Words)と言います。
そして、このバッファというのは保存し続ければやはりパンクしてしまうので解放する必要があります。その解放をフラッシュすると表現します。
この一連を「std::endl」を使えば出来ます、が。
分かる通り、この処理は軽いとは言えないので、多用はしてほしくないです。
改行というのは「"\n"」で済みますし、プログラムが終了されれば全てのバッファは必ずフラッシュされます。
でもでも、プログラムが長くなってしまい、適宜バッファをフラッシュしたい場合があると思います。
そのため、というかバッファをフラッシュするだけの関数があります。
「std::flush」といいます。
std::flush
ひとまず、リファレンスを見てみます。
リファレンス:std::flush - cppreference.com
まぁ、先ほど細かく説明したつもりなので特に書くことはないのですが、このリファレンスの「ノート」をよく読んでください。そこの5行目からです。
書いてある通り、std::cinとstd::cerrを呼んだ場合、std::cout.flushが呼ばれるため、std::endlもといstd::flushは呼ばなくていいんです。std::cinのときに呼んだらエラーが吐かれた気がします。
総括
箇条書きでまとめると
・"\n"で済ませられるならstd::endlを使わない。
・バッファが溜まってそうだし、不安だしって思うならstd::flushを呼ぶ。
・std::cinとstd::cerrでは、std::flushとstd::endlを使わなくていい。
・プログラムの終了時に全てのバッファはフラッシュされる。