Warum erlaubt g ++ mir, diese void-Funktion als etwas anderes zu betrachten?

8

Warum kompiliert sich folgendes in GCC 4.8 ( g++ )? Ist es nicht völlig schlecht gebildet?

%Vor%
  1. Ich versuche das Ergebnis des Aufrufs von test zu verwenden, das nicht existiert
  2. Ich versuche, einen Wert von test zurückzugeben.

Beide sollten grundsätzlich unmöglich sein - nicht nur UB, soweit ich mich erinnern kann - mit einem void Rückgabetyp.

Die einzige Warnung, die ich bekomme, ist, dass x ungenutzt ist, nicht einmal irgendetwas über einen nicht standardisierten impliziten Rückgabetyp, der hinzugefügt wird.

Live-Demo

    
Lightness Races in Orbit 04.01.2014, 16:52
quelle

2 Antworten

11

Das ist erlaubt durch den Standard (§6.6.3 / 3)

  

Eine return-Anweisung mit einem Ausdruck vom Typ void kann nur in Funktionen mit dem Rückgabetyp cvoid void verwendet werden. Der Ausdruck wird ausgewertet, kurz bevor die Funktion zu ihrem Aufrufer zurückkehrt.

    
Mat 04.01.2014, 16:55
quelle
6

Warum GCC dies erlaubt - sicher, weil der Standard es für gültig hält. Ich bin mir ziemlich sicher, dass GCC dies erlaubt, weil es im Falle von Templates nützlich ist.

%Vor%

Wie Sie sehen, musste call keinen speziellen Fall für void in der return-Anweisung ausführen. Ähnlich wie x.~T() zulässig ist, auch wenn T als int endet.

    
Johannes Schaub - litb 04.01.2014 21:12
quelle

Tags und Links