I don't know how it is for C++ but I like JetBrains products for Python and Java. They have a C++ specific one too. Both pycharms (python) and intellij (java) have some support for other languages, so I know for example that pycharms recognizes C and C++ system and does some basic highlighting, but I don't think it does much correctness checking, or symbol lookup, or stuff like that.
Until a few years ago I never used IDEs which was partly that IDEs sucked for most of my career and partly stubbornness. But yeah your cycle time gets cut way down because now I never make stupid spelling mistakes or errant commas and stuff like that. Those are especially annoying when it takes a few minutes to get a program running to the point where your bug occurs. The refactoring tools are nice too, especially since I am terrible at naming everything.
Regarding C++ and it's undefined behaviors, they are many. I am not sure I want to get into it here, but they are so numerous that the standard actually defines multiple classes of them.
http://en.cppreference.com/w/cpp/language/ub
C++ compilers are allowed to have behaviors that differ between them as long as they're documented. Holy ****, good luck with your cross-platform project.
Then there's "unspecified behavior" where what you're doing isn't explicitly covered by the spec, but you will get *one* of the possible valid results. You may get a different one if you turn optimization on! A good example of these are order-of-operations, which have somewhat complex and subtle problems, especially in multi-threaded programs. I think most C++ programmers probably know that a single line of C++ is not necessarily going to be atomic in a multi-threaded environment, but because a single line might be 3 or 4 atomic operations, the order those operations happen in might have weird results in a multi threaded environment. There's a good example here (the double-checked locking example):
https://stackoverflow.com/a/367690
Another favorite of mine is that
foo(a(), b())
it is not necessarily the case that a() will be called before b()
And finally there's undefined behavior where the compiler is literally allowed to produce whatever nonsense it wants. Most of these are mistakes by the programmer but a lot of them will look like pretty valid code, or actually will be valid except for some edge cases in input parameters.