2017-10-16 4 views
0
#include <iostream> 
#include <functional> 
#include <memory> 

using namespace std; 

template<typename T = int> std::enable_if_t<!std::is_arithmetic<T>{}, T> nope() {} 

int main() { 
    nope(); 
} 

Dies ist ein einfacher Code, der nicht kompiliert. Wenn man sich das geändert:Wie funktioniert enable_if in diesem Fall

int main() { 
     nope(); 
} 

zu

int main() { 
     nope<std::string>(); 
} 

es beginnt zu kompilieren. Die Frage ist, warum funktioniert das wie es funktioniert? Um genauer zu sein warum Compiler sagt mir:

keine passende Funktion für Aufruf von 'Nö()'

statt so etwas wie

enable_if :: gefunden Typ nicht (was wahr ist, wie es wirklich nicht existiert, wenn die Bedingung nicht erfüllt ist)?

Vielen Dank.

+0

Da Ihr fragen, warum der Compiler nicht zufrieden bevorzugt eine Fehlermeldung gegenüber einer anderen, sollten Sie diese Frage mit dem von Ihnen verwendeten Compiler markieren. –

+0

Was Sie sehen, heißt [SFINAE] (http://en.cppreference.com/w/cpp/language/sfinae). – HolyBlackCat

+0

Sowohl GCC als auch Clang geben anständige Fehlermeldungen. Clang gibt sogar 'Hinweis: Kandidat Vorlage ignoriert: deaktiviert durch' enable_if '[mit T = int] mit enable_if_t = typename enable_if <_Cond, _Tp> :: type; ' – NathanOliver

Antwort

0

Wenn Sie nope() anrufen, lautet Ihr Standardtyp templateint. std::enable_if_t<!std::is_arithmetic<T>{}, T> gibt false für !std::is_arithmetic<int>{} zurück und schlägt fehl.

Ein Anruf an nope<int>() würde auch fehlschlagen, aus den gleichen Gründen wie warum nope() fehlschlägt.

Auf der anderen Seite erhält nope<std::string>true in is_arithmetic und gibt eine funktionierende Funktion zurück.

Der Compiler-Fehler, die ganz klar mit clang++ Version 5.0 erklärt, das Ergebnis wird ausgelöst:

Kandidatenvorlage ignoriert: Anforderung ‚!std::is_arithmetic<int>{}‘ war [with T = int] std::enable_if_t<!std::is_arithmetic<T>{}, T> nope() {}

+0

Ja, ich habe das. Aber wie ich std. :: enable_if_t {} verstehe, gibt T> nicht false zurück, wie es so definiert ist: Vorlage mit enable_if_t = typenname enable_if : :Art; Sollte es Compiler Fehler nicht auslösen, da Typ nicht in Fall B == false definiert ist? – s0nicYouth

+0

Es wirft einen Compilerfehler auf, siehe den obigen Kommentar von @nwp.Mein GCC ist auch nicht zu klar, aber die Clam-Nachricht ist klar. – Chiel

Verwandte Themen