That's not modern C++. This is much less noisy:
#include <memory>
#include <vector>
// ...
// circle and shape are user-defined types
auto p = make_shared<circle>( 42 );
auto shapes = load_shapes();
for (auto s : shapes) {
if( s && *s == *p )
cout << *s << " is a match\n";
}
Not sure what MS is thinking.