When I'm using a language, alarm bells ring when I find myself needing to type something like :
std::vector<char> v(std::istream_iterator<char>(ifs), std::istream_iterator<char>());
When I'm using a language, alarm bells ring when I find myself needing to type something like :
std::vector<char> v(std::istream_iterator<char>(ifs), std::istream_iterator<char>());
To the Clang team, this is damn impressive. I've never thought about a compiler detecting merge conflicts, but thats pretty cool.
With C++ most of the time, one is either consuming a huge/important library (even an OS SDK) or writing one. If you're consuming the librarie(s), you just can't go around typedefing important APIs, or you will end up maintaining a nightmare of a fork. And if you're writing one, the sensible thing to do is to stick with a tangible subset of C++, like most good libraries do.
Seriously, if your C++ code starts to look ugly, you're probably using the language to its full potential. Don't do that. Scale back to a manageable C-like subset; And no, you can't grow your C++ code-base to a blissful Greenspun-esque nirvana; more C++ begets, well, MORE C++. Those multi-page Doxygen class listings and woolly dependency diagrams never gel and mesh into something organic. The code-base just grows diagonally, and orthogonal to your intended direction..