En el siguiente ejemplo de código, la if
instrucción depende del bool
parámetro de plantilla, que es una constante en tiempo de compilación. Los compiladores manejan este código de manera diferente:
MSVC falla con el error de enlace (que es lo que esperaba), porque la función de plantilla en la
else
rama carece de especialización para eltrue
valor del parámetro de plantilla (aunque nunca se llama).GCC y Clang compilan sin problemas y el comportamiento en tiempo de ejecución es correcto. Obviamente, esto se debe a que evalúan la
if
declaración en tiempo de compilación y eliminan las ramas no utilizadas antes de vincular.
La pregunta es qué comportamiento cumple con los estándares (o es un comportamiento indefinido y ambos son correctos a su manera).
#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