Im folgenden Codebeispiel ifhängt die Anweisung vom boolVorlagenparameter 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
elseVerzweigung nicht auf dentrueWert 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
ifAnweisung 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