Porque -o especifica o outfile. O primeiro significa que o outfile seria 'foo.cpp', enquanto o segundo significa que seu outfile será 'foo'.
A sintaxe do g ++ é:
gcc [-c|-S|-E] [-std=standard] [-g] [-pg] [-Olevel] [-Wwarn...] [-pedantic] [-Idir...] [-Ldir...] [-Dmacro[=defn]...] [-Umacro] [-foption...] [-mmachine-option...] [-o outfile] [@file] infile...
Página man relevante: link