"\n" xuất ký tự xuống dòng (theo biểu diễn phụ thuộc nền tảng, sinh "\r\n" trên Windows), nhưng std::endl làm cùng việc và xóa bộ đệm (flush) luồng. Thường thì bạn không cần xóa bộ đệm ngay lập tức và nó chỉ làm giảm hiệu suất, nên hầu hết trường hợp không có lý do dùng std::endl.
Khi bạn muốn xóa bộ đệm thủ công – ví dụ vì mong đợi đầu ra hiển thị kịp thời cho người dùng – bạn nên dùng std::endl thay vì ghi '\n' vào luồng (dù là ký tự đơn lẻ hay một phần chuỗi).