?
Ich denke, man muss hier die Historie bedenken. Diese Dinge sind praktisch unverändert von C übernommen worden, und in C war es durchaus üblich,
hello() {
puts("Hello, world.");
}
main() {
hello();
return 0;
}
zu schreiben. Ob man jetzt die Deklaration eines Basisdatentyprückgabewertes, der unter Umständen nicht verwendet wird, im C++-Standard hätte verbieten sollen, ist eine spannende, aber auch etwas müßige Frage. Ich kann damit leben, wenn in solchen Fällen ein unspezifizierter Wert zurückkommt, und mit Nicht-PODs kriegt man da eh undefiniertes Verhalten. Vom Compiler zu erwarten, solche Dinge gar nicht erst zu akzeptieren, ist allerdings etwas schwieriger. Ich gebe zu bedenken, dass
enum my_enum {
FOO,
BAR,
BAZ
};
int some_function(my_enum x) {
switch(x) {
case FOO:
case BAR:
return 1;
case BAZ:
return 2;
}
}
vom Compiler nicht für wasserdicht gehalten werden könnte, aber durchaus gerne mal vorkommt (auch wenn ich das für stilistisch nicht sehr sauber halte und es sehr begrüße, wenn ein Compiler da warnt). Zumal die Prüfung der Ausführungspfade insbesondere bei Switches, aber auch bei if-Blöcken, zu der Zeit, als C++ standardisiert wurde, alles andere als gang und gäbe war. Und die auch alles andere als trivial ist, weil ein Compiler sich auch um Sprungkonstrukte sorgen muss, die heute kein Programmierer, der etwas auf sich hält, noch in seine Versionskontrolle lassen würde.
switch(foo) {
case 1:
if(bar) {
} else {
case 2:
}
}
ist gültiges C++!