When injecting std::endl into an output stream, two things happen:
  -  An end of line character '\n'is added to the stream
-  The stream is flushed 
In many situations, you don’t need the stream to be flushed: It takes some time, and additionally, the stream is also flushed automatically in
several circumstances:
  -  When the stream is closed 
-  In the case of std::cout, each time an input is read onstd::cinor an output is written onstd::cerr
-  In the case of std::cerr, each output is immediately written, the is no need to flush
Therefore, if your only goal is to add an end of line, '\n' is usually more efficient than std::endl. If you do want to
flush, you can be explicit and inject std::flush into the stream, or call the flush member function on the stream.
Noncompliant code example
void f() {
  cout << "Hello world!" << endl << endl << "How are you?" << endl; // Noncompliant, 3 useless flushes
  string s;
  cin >> s;
  cout << "Starting long operation now..." << endl; // Noncompliant, flushing is useful, but not explicit enough
  longOperation();
  cout << "Long operation is done" << endl; // Noncompliant
}
Compliant solution
void f() {
  cout << R"(Hello world!
How are you?
)" << endl;
  // Or
  cout << "Hello world!\n\nHow are you?\n";
  string s;
  cin >> s;
  cout << "Starting long operation now...\n" << flush;
  longOperation();
  cout << "Long operation is done\n";
}