std::cerr << std::endl;

std::cerr は標準エラー出力に関連付けられたバッファなしの出力ストリームオブジェクトで, std::endl は改行文字を出力してバッファをフラッシュするマニピュレータ. そんなら, 標記のように std::cerr に対して std::endl を使うのはほとんど意味がなくて, std::cerr << "\n" で十分なはずだよなぁ, むしろタイプ量が少ないんだから後者を使う方が良いよなぁ, と思うんだけど.

C++ 規格書が欲しい.


追記. 以下のコードをコンパイルして実行してみた. (g++ (GCC) 4.1.1 (Gentoo 4.1.1-r1))


#include <iostream>
#include <cstdlib>
#include <unistd.h>

void output_test(std::ostream& os)
{
    os << "before ::sleep(2) -- ";
    ::sleep(2);
    os << " -- after ::sleep(2), w/o std::endl\n";

    os << "before ::sleep(2) -- ";
    ::sleep(2);
    os << " -- after ::sleep(2), w/ std::endl" << std::endl;

    return;
}

int main(void)
{
    std::cout << "::output_test(std::cerr)" << std::endl;
    ::output_test(std::cerr);
    std::cout << std::endl;

    std::cout << "::output_test(std::clog)" << std::endl;
    ::output_test(std::clog);
    std::cout << std::endl;

    std::cout << "::output_test(std::cout)" << std::endl;
    ::output_test(std::cout);
    std::cout << std::endl;

    return EXIT_SUCCESS;
}

std::cout とは違う, という事は分かったが, バッファの有無の違いしかないはずの std::cerrstd::clog とでは挙動の違いはなかった. 上のコードが適切でない事も考えられるけど…うぅむ.