2017-09-22 3 views
0

Ich frage mich, warum die unten Funktion Vorlage Spezialisierung nicht kompiliert (aufgrund no return statement in function returning non-void).Bool Rückgabewert in Funktion Vorlage Spezialisierung

class Boring { 
public: 
    template<typename T> bool eval() const { } 
}; 

template<> inline bool Boring::eval<int>() const { return true; } 

Ich würde erwarten, dass die nicht-spezialisierten Funktionsvorlage, es sei denn verwendet nicht bewertet werden würde. Wenn der Rückgabetyp zu T* geändert wird, kompiliert das Unten erfolgreich.

int x = 5; 

class Boring { 
public: 
    template<typename T> T* eval() const { } 
}; 

template<> inline int* Boring::eval<int>() const { return &x; } 

Antwort

0

Beide Programme sind wohlgeformt. Obwohl ein undefiniertes Verhalten auftreten würde, wenn die primäre Vorlage eval instanziiert und aufgerufen würde, macht das das Programm nicht schlecht dargestellt. Sie haben jedoch Ihren Compiler in einem Modus, in dem einige Warnungen als Fehler behandelt werden (z. B. -Wall), oder er behandelt diese Warnung standardmäßig als Fehler.

+0

Ich nehme an, meine Frage kommt von der Tatsache, dass die primäre Eval-Vorlage im T * -Fall den gleichen Fehler (ungültiger Rückgabetyp) ergeben würde, aber der bool return case führt zum Kompilierungsfehler. Beide Funktionsvorlagen haben leere Körper. –

+0

@ JohnKane Das ist eine Qualität der Implementierungsproblem. Legen Sie einen Fehler für Ihren Compiler fest, um im zweiten Fall die fehlende Rückgabeanweisung nicht erkennen zu können. – Brian

Verwandte Themen