Visual C++: Letting C++ programmers get away with new murder without warning

Consider Visual C++.

This always correct code emits a completely useless warning:

try {
    ...
} catch (const std::exception& ex) {
    printf("foo\n");
}
test.cpp(3): warning C4101: 'ex' : unreferenced local variable

This never ever correct code doesn’t emit any warning at all:

throw new exception("foo");

Visual C++ is a totally awesome piece of technology.  So why doesn’t it work the way I want it to?