Als je complete compilatie unit bestaat uit één enkel bestand dan heeft het geen effect. Bij meerdere bestanden heeft het natuurlijk wel effect. Maar mijn verhaal verduidelijkt dat niet.
Mijn punt was dat het niet nodig was

En volgens mij kan je die regel gewoon verplaatsen zonder problemen
Deze moest ik opzoeken en je hebt hier inderdaad een goed punt. Echter het schijnt dat veel implementaties "\n" als een impliciete flush gebruiken. Maar std::endl houdt rekening met het platform en gebruikt "\r\n", "\r" of "\n". Overigens schijn je het wel of niet flushen te kunnen instellen.
Echter dit blijft een goed punt, mijn complimenten, ik had hier nooit bij stil gestaan.
Overigens kan je hier ook een argument maken dat ik een aanname maak.
Bron:
http://en.cppreference.com/w/cpp/io/manip/endlJe hebt gelijk, main is inderdaad een uitzondering (C99 beschrijft dit, maar dit is C, echter ik ga ervan uit dat C++ standaard ook zoiets heeft).
Het is inderdaad flauw

Dat kan misschien vanaf C++11, maar alleen als de class voldoet aan de copy-assign. Maar volgens mij zijn dit gewoon twee operaties.
code:
1
2
3
| std::string a1 = "lol"; // 2 operations: constructor, assign operator
std::string a2("lol"); // 1 operation: constructor
std::string a3 = std::string("lol"); // 1 of 3 operations afhankelijk van welke std-lib en versie van C++ |
Maar ik ben zeer benieuwd of het bovenstaande wel juist is. C++ heb ik al een tijdje niet meer aan hoeven te raken.
"Doubt—the concern that my views may not be entirely correct—is the true friend of wisdom and (along with empathy, to which it’s related) the greatest enemy of polarization." -- Václav Havel