Empty parentheses in throw() are sometimes said to mean the function does not throw. If C++ were a bit more like Java, this might be the case.
Empty parens in throw() actually mean that the compiler should emit code at every call site to prevent any exception thrown by the function from propagating past the call site. So the function might still throw (there's no way to stop it - unlike Java, the throw specification in C++ is not part of the function signature, so there's no way to prevent you linking against a version of the function that does throw something). But the call to the function doesn't.
So the code surrounding that call can assume that it doesn't throw anything, because the compiler ensures at run time, by emitting code, that anything it throws is trapped and std::unexpected() called instead of propagating the exception. This usually results in program termination.
Except when it doesn't. MSVC at versions 7 and below doesn't actually bother emitting the extra code, but it does still make optimizations based on the assumption that nothing is thrown.
So, an empty throw specification allows optimizations on MSVC 7 or less. If the function actually does throw after all, then something unpleasant will happen. On other compilers, it may allow optimizations based on nothing being propagated, but at the cost of emitting extra try/catch blocks to enforce that if anything is thrown, then it's handled (probably by terminating) instead of propagating it.
This situation is rather different from Java, where (Errors and RuntimeExceptions not included) a throws clause means business, and the compiler will enforce by compile time checking that no disallowed exceptions are thrown. C++ has no such compile time checking.
Herb Sutter has more to say on the topic: http://www.gotw.ca/publications/mill22.htm