Сам на С++ пишу редко (но раньше, до стандарта 11, писал много), так что если в каких-то пунктах ошибаюсь или отстал от жизни то поправьте плиз.
KP>Ну вообще-то, в 21 веке, более-менее квалифицированные C++ программисты такого трэша не пишут и пользуются умными указателями 
То что умные указатели так прижились, это имхо не достижение а косяк языка. Со стороны других языков эти умные указатели видятся таким кусочком GC кишками наружу с постоянным шумом в сорцах и непредсказуемом оверхэде в исполняемом коде.
KP>Я правильно понимаю, что это единственная проблема C++ исключений?
То что не нравилось мне:
1) нет finally, поэтому основная идиома "прибрать за собой в любом случае, было исключение или нет", превращается либо в двойные телодвижения, либо в надежду на RAII. Про макросы и библиотеки эмулирующие finally я вкурсе, не устраивают.
2) можно кидать и ловить любую ерунду, с которой потом фиг поймёшь что делать. Вместе с другими зажравшимися программистами из мира интерпретаторов я уже привык к удобному объекту "исключение", с полями, методами, вот этим всем.
3) разные команды используют разные базовые классы для исключений, и ни в стандарте ни в популярных либах нету самого главного — стэк трэйса. В результате на разных платформах и в разных компиляторах нужен разный код для сбора стэктрэйса, котрый вроде как нужно вызывать именно в методе где летело само исключение, потом уже поздно. На MSVC точно было именно так, на GCC чуть легче, на Intel не помню.
4) как следствие 3 большинство глобальных перехватов исключений сводится к "записать memory dump при вылете". В том же C# до мемори дампа дело доходит гораздо реже чем в C++.
5) возникают сложные моменты если исключения летят в конструкторах/деструкторах. Для собеседований оно даже хорошо, для надёжной работы не очень.
6) хотелось бы больше помощи от компилятора/IDE в деле разбора чего как и откуда в принципе может вылететь. Этого хотелось бы от всех компиляторов, но C++ в этом чуть впереди, так как появился noexcept.