Im folgenden Codebeispiel if
hängt die Anweisung vom bool
Vorlagenparameter ab, bei dem es sich um eine Konstante zur Kompilierungszeit handelt. Compiler behandeln diesen Code unterschiedlich:
MSVC schlägt mit einem Verbindungsfehler fehl (was ich erwartet habe), da die Vorlagenfunktion in der
else
Verzweigung nicht auf dentrue
Wert der Vorlagenparameter spezialisiert ist (obwohl sie nie aufgerufen wird).GCC und Clang werden beide ohne Probleme kompiliert und das Laufzeitverhalten ist korrekt. Dies liegt offensichtlich daran, dass sie die
if
Anweisung beim Kompilieren auswerten und nicht verwendete Zweige vor dem Verknüpfen entfernen.
Die Frage ist, welches Verhalten standardkonform ist (oder ist es ein undefiniertes Verhalten und beide sind auf ihre Weise korrekt)?
#include <iostream>
template<const bool condition>
struct Struct
{
void print()
{
if (condition)
{
std::cout << "True\n";
}
else
{
printIfFalse();
}
}
private:
void printIfFalse();
};
template <>
void Struct<false>::printIfFalse()
{
std::cout << "False\n";
}
int main()
{
Struct<true> withTrue{};
withTrue.print();
Struct<false> withFalse{};
withFalse.print();
return 0;
}
if constexpr