2016-07-08 22 views
3

Wie ist constexpr if und SFINAE verwandt?
Verwendet der Compiler SFINAE bei der Auswertung von "constexpr if" -Ausdrücken?Wird "constexpr if" als SFINAE betrachtet?

Ich denke "constexpr if" ist mit SFINAE.
Es wird im Bedingungsblock ersetzt, aber nicht ausgegeben, wenn es nicht möglich ist.

Auf der anderen Seite ist SFINAE als eine Regel für Überladung Auflösung der Funktionsvorlagen definiert, und ich nehme an, Sie sind bereits in einer Funktion, wenn "constexpr if" ausgewertet wird.

Der Compiler muss mehrere Funktionen für die verschiedenen Pfade von constexpr generieren, wenn dies abhängig davon ist, wie die Funktion aufgerufen wird. Vielleicht nutzt es also die Überladungsauflösung.

Der angenommene Vorschlag erwähnt nicht "SFINAE" oder "Überlastungsauflösung".
Also ich bin gespannt, ob beide Konzept in Bezug auf "constexpr if" anwendbar ist.

Antwort

9

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 Tvoid 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.

+0

Wie lautet der korrekte Name für diese gemeinsame Eigenschaft von Vorlagen und 'if conexpr'? –

+2

@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. –