Sind alle nicht verwendeten undefinierten Methoden erlaubt?

8

Hier ist eine Klasse mit einer undefinierten Methode. Scheinbar erlauben Compiler, Instanzen dieser Klasse zu konstruieren, solange die undefinierte Member-Funktion niemals aufgerufen wird:

%Vor%

Hier ist eine ähnliche Situation, aber eine, die Vererbung beinhaltet. Die Unterklasse Bar erweitert die Basisklasse Foo . Foo definiert eine Methode g() . Bar deklariert die gleichnamige Methode, definiert sie aber nicht:

%Vor%

Hier ist eine Variation des Obigen. Der einzige Unterschied hier ist, dass g() ist virtual für beide Foo und Bar :

%Vor%

Siehe die Codekommentare für den Kontrast des unterschiedlichen Verhaltens zwischen VC2013 und g ++.

  1. Welcher Compiler ist korrekt, falls vorhanden?
  2. Warum hat der VC2013-Compiler in seiner Version einige Beschwerden mit dem virtual -Schlüsselwort im Vergleich zu dem in seiner Version ohne das virtual -Schlüsselwort?
  3. Sind nicht verwendete undefinierte Methoden immer erlaubt? Wenn nicht, was sind all die Fälle, in denen sie sind nicht erlaubt?
  4. Wird Bar 's Deklaration von g() als überschreibend gezählt auch wenn Bar keine Definition liefert?
CodeBricks 07.11.2014, 22:45
quelle

1 Antwort

8
  

Welcher Compiler ist korrekt, falls vorhanden?

Sie haben beide Recht. Ihr Code ist falsch, keine Diagnose erforderlich. [klasse.virtual] / 11

  

Eine in einer Klasse deklarierte virtuelle Funktion soll definiert oder deklariert sein   rein (10.4) in dieser Klasse oder beides; aber keine Diagnose ist erforderlich   (3.2).

[intro.compliance] / 2:

  

Wenn ein Programm eine Regelverletzung enthält, für die keine Diagnose gilt   Diese Internationale Norm verlangt keine Anforderungen   Implementierungen in Bezug auf dieses Programm.

Sehen Sie sich Ihre Optimierungseinstellungen für GCC an, sie können das Verhalten beeinflussen.

  

Sind nicht verwendete undefinierte Methoden immer erlaubt?

Eine Elementfunktion muss genau dann definiert werden, wenn sie odr-used ist. [basic.def.odr] / 3:

  

Jedes Programm soll genau eine Definition von jedem Nicht-Inline enthalten   Funktion oder Variable, die in diesem Programm verwendet wird; keine Diagnose   erforderlich.

Betrachten Sie nun [basic.def.odr] / 2:

  

Ein Ausdruck wird möglicherweise ausgewertet , es sei denn, es handelt sich um einen unevaluierten Operanden (Abschnitt 5) oder einen Unterausdruck davon.
  [...]
  Eine virtuelle Mitgliedsfunktion wird odr-verwendet, wenn sie nicht rein ist.
  Eine nicht überladene Funktion, deren Name als potenziell ausgewerteter Ausdruck oder als Mitglied einer Menge von Kandidatenfunktionen erscheint, wird, wenn sie durch Überladungsauflösung aus einem potenziell ausgewerteten Ausdruck ausgewählt wird, odr verwendet, es sei denn, es handelt sich um ein reines virtuelles Objekt Funktion und ihr Name ist nicht explizit qualifiziert.

Sie dürfen weiterhin nicht definierte nicht-virtuelle Elementfunktionen in decltype oder sizeof verwenden. Aber nicht-reine virtuelle Funktionen werden odr-einfach verwendet, weil sie nicht rein sind.

  

Zählt Bars Deklaration von g () auch bei Bar als überschreiben   bietet keine Definition?

Ja.

    
Columbo 07.11.2014, 22:54
quelle