"if constexpr" de C 17 limitado a funciones de plantilla
En C 17, la introducción de "if constexpr" ha despertado interés en su capacidad de ejecutar código condicionalmente basado en constantes de tiempo de compilación. Sin embargo, surge un problema al intentar usarlo en funciones sin plantilla.
Considere el siguiente código:
#include
#include
void print(auto value)
{
// Compile-time check if value is a pointer
if constexpr (std::is_pointer_v)
std::cout Si bien este código se compila sin errores en funciones con plantilla, falla con un error de compilación cuando se coloca en una función sin plantilla como imprimir. La razón radica en el comportamiento de "if constexpr".
"if constexpr" está diseñado para permitir la compilación condicional de código de plantilla. En una función de plantilla, el compilador deduce el tipo de parámetro en el momento de la compilación, lo que permite seleccionar la ruta de código adecuada según el tipo. En este caso, cuando la función de impresión tiene una plantilla, puede identificar si el valor es un puntero en el momento de la compilación y ejecutar la rama de código correspondiente.
Sin embargo, en una función sin plantilla, se conoce el tipo de valor sólo en tiempo de ejecución, lo que hace que "if constexpr" sea ineficaz. El compilador trata ambas ramas del condicional como código ejecutable, lo que genera un error de compilación al intentar desreferenciar el valor en Ptr para bifurcar cuando el valor es un número entero.
Para evitar este problema, es necesario colocar " if constexpr" dentro de una función de plantilla o proporcione información de tipo explícita a la función sin plantilla para garantizar la deducción de tipos en tiempo de compilación.
Descargo de responsabilidad: Todos los recursos proporcionados provienen en parte de Internet. Si existe alguna infracción de sus derechos de autor u otros derechos e intereses, explique los motivos detallados y proporcione pruebas de los derechos de autor o derechos e intereses y luego envíelos al correo electrónico: [email protected]. Lo manejaremos por usted lo antes posible.
Copyright© 2022 湘ICP备2022001581号-3