SFINAE, im Kern ist dies: Sie schreiben bestimmten Code, der eine illegale Sache in C++ auslöst. Da Sie diesen Code jedoch an einem bestimmten Ort abgelegt haben, verursacht er keinen Kompilierungsfehler. Es bewirkt nur, dass die Definition, die diesen Code enthielt, verschwindet. Sie können daher konditionale Tests verwenden, die, wenn "true" in der legalen C++ - Syntax resultiert und "false" nicht (gegenüber std::enable_if
).
if constexpr
hat nichts mit SFINAE zu tun. if constexpr
evaluiert lediglich einen konstanten Ausdruck und führt dann einen Satz von Anweisungen oder den anderen aus. Der einzige "SFINAE" -liche Teil besteht darin, dass irgendwelche Aussagen im nicht ausgeführten Teil der Bedingung effektiv nicht existieren, wenn sie in einer Schablone verwendet werden (und wenn sie nicht in einer Schablone sind, haben sie so wenig Effekte wie möglich). So ist es möglich, so etwas zu tun:
template<typename T>
void Foo()
{
if constexpr(!is_same_v<T, void>)
{
T t;
}
}
Der Code innerhalb der if
Aussage wäre illegal gewesen, wenn T
void
sind. Da die Bedingung jedoch darin besteht, den potenziell illegalen Code zu entfernen, ist es legal, Foo<void>
zu rufen.
Verwendet der Compiler SFINAE bei der Auswertung von "constexpr if" -Ausdrücken?
Es könnte, aber ernsthaft, warum sollte es? Es ist der Compiler; Es muss nicht enable_if
Gymnastik oder C++ Vorlage Arcana verwenden, um Aussagen verschwinden zu lassen. Es wertet nur einen konstanten Ausdruck aus und macht basierend darauf Aussagen weg.
Es ersetzt den bedingten Block, aber nicht aus, wenn es nicht möglich ist.
Nein, die Bedingung muss ein zulässiger C++ - Konstantenausdruck sein, unabhängig davon, ob sie wahr oder falsch ist. Der nicht ausgeführte Block kann eine unzulässige Syntax enthalten. Aber die Bedingung selbst muss immer legal sein.
Wie lautet der korrekte Name für diese gemeinsame Eigenschaft von Vorlagen und 'if conexpr'? –
@EuriPinhollow: Es gibt keinen Namen dafür, da sie zwei verschiedene Dinge auf verschiedene Arten machen.Sie sind nur insofern ähnlich, als sie Code basierend auf einer Art bedingter Anweisung verwerfen. Man könnte es als bedingte Kompilierung bezeichnen, aber selbst das ist nicht bezeichnend für den Umfang. –