It's called a vector because Alex Stepanov, the designer of the Standard Template Library, was looking for a name to distinguish it from built-in arrays. He admits now that he made a mistake, because mathematics already uses the term 'vector' for a fixed-length sequence of numbers. Now C++0X will compound this mistake by introducing a class 'array' that will behave similar to a mathematical vector.
I always compile with Wno-missing-braces to fix the array warnings without making my code non-portable.
I find it funny that they "solved" the "problem" of having too many ways to initialize variables by creating a new system that still doesn't always work. Try creating a vector of 10 integers with uniform initialization syntax.
Why do languages strive for reverse compatibility when people will use different versions anyway? It's turned Java into a mess and made C++ seem scary to those new to programming.
Backwards compatibility is important for industry. Scala and Python are criticized for breaking backwards-compatibility too often. Industry doesn't want to rewrite code over and over again, because someone thought out a prettier initialization construct (anyway, I really don't understand why a language needs any special syntax for initialization - many languages do without it and are more readable).
I'm not entirely following the backwards compatibility story. The code is already finished and compiled, no? Why do future updates matter? If you're going to add on or rework part of the code, use the old compiler. Yes, it might be a bit messy to keep 3~4 compilers around for different programs, but
a) it's more messy to force everyone to use constructs invited in the 90s for modern code, and
b) forcing a bit of rework on 10y old code isn't really a bad idea, to be honest.
@Gaimic, code is *never* finished. Programs need usually some maintenance. Imagine your customer found a bug. You debug it, and you find it is a bug not in your code, but in some external library you use. Ok, no problem - get a newer version of the library and recompile / relink. Should be easy, shouldn't it? Ok, so you download a newer version of the library, recompile, and bang, 20 errors. The library authors moved to a new language / standard library version and now their code doesn't compile with the old build stack. Ok, fine, so you upgrade your compiler/build stack to the one supported. Bang, 1000 errors. The library compiles fine, but your code and another librariy doesn't any more. Well, so you upgrade that library... You may as well end up porting whole project to the newer version of the language.
Even languages/frameworks very, very careful about backwards compatibility like Java, both on API and ABI level, sometimes break it due to bugs or very subtle changes in behaviour. That is why evolving a mature language is very hard.
The library authors moved to a new language / standard library version and now their code doesn't compile with the old build stack. Ok, fine, so you upgrade your compiler/build stack to the one supported. Bang, 1000 errors. The library compiles fine, but your code and another librariy doesn't any more. Well, so you upgrade that library.
That's exactly the trap Sun Studio ended up in: they first released a badly rushed C++ compiler (version 5.0) in 1998 with important parts of the language still missing and (stupidly, in my opinion) #ifdef'd out the parts of the standard library (which they didn't write themselves, it was licensed) which couldn't be compiled by that incomplete compiler. The very next version of the compiler (5.1) supported the missing language features, but the #defines are still there today, in 2012, because if they are ever removed, not only the newly-compiled programs won't link with old libraries, old programs won't *run* at all (unless statically linked).
They offer another standard library (since 2002) and an option to download and install yet another, but they aren't the defaults, again, because newly compiled code would not link against old libraries.
Uniform initialization is supposed to provide a single syntax for initializing anything, but it confuses constructor arguments with initializer lists. This makes it impossible to use curly braces for all of your initializations, which makes the whole idea pretty stupid.