#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.
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. –
Was Sie sehen, heißt [SFINAE] (http://en.cppreference.com/w/cpp/language/sfinae). – HolyBlackCat
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