Ich versuche, ein paar templatisierte Funktionen für Substitution Fail Is Not An Error(SFINAE) zu verwenden. Und ich kann es so machen:Warum können diese templatisierten Funktionen keine Argumente annehmen?
template<typename R, typename S = decltype(declval<R>().test())> static true_type Test(R*);
template<typename R> static false_type Test(...);
Aber ich verstehe nicht, wie das Argument diesen SNFIAE funktioniert. Es scheint, als ob ich nur in der Lage sein sollte, um die Argumente zu entfernen und die Template-Auswahl würde genau die gleiche Art und Weise funktionieren:
template<typename R, typename S = decltype(declval<R>().test())> static true_type Test();
template<typename R> static false_type Test();
Aber es funktioniert nicht, erhalte ich:
Aufruf überladenen ‚Tests () 'ist mehrdeutig
Worum geht es bei diesen Argumenten, die diese SFINAE funktionieren lassen?
Aber darüber hinaus ist es etwas Besonderes, diese Argumentation Typen, die sie verursacht in der richtigen Reihenfolge zu bewerten. Ich verstehe nicht, warum der Compiler "R *" zu "..." vorzieht. Kannst du das erklären? –
@ JonathanMee, wird zur Antwort hinzufügen. – SergeyA
@ JonathanMee um es einfach zu sagen, (...) ist die am wenigsten bevorzugte Übereinstimmung mit einer Argumentliste bei der Durchführung der Überladungsauflösung. Dies ist beabsichtigt und im Standard vorgeschrieben. Zufälligerweise ist es auch der am wenigsten bevorzugte Weg, eine Funktion mit variablen Argumenten zu implementieren :-) –