"\n" xuất ký tự xuống dòng (biểu diễn phụ thuộc nền tảng, trên Windows tạo "\r\n"), nhưng std::endl làm điều đó VÀ xóa bộ đệm (flush stream). Thường bạn không cần flush ngay lập tức và nó tốn hiệu năng, nên hầu như không lý do dùng std::endl.
Khi bạn muốn flush thủ công để đầu ra hiển thị kịp thời cho người dùng (không chậm trễ), hãy dùng std::endl thay vì ghi '\n' vào luồng.