Comportamiento inconsistente de static_assert con parámetros de plantilla que no son de tipo en todos los compiladores
En C, se puede usar un static_assert para verificar las condiciones en tiempo de compilación . Sin embargo, una observación reciente ha revelado una disparidad en el comportamiento de static_assert cuando se usa junto con parámetros de plantilla que no son de tipo en diferentes compiladores.
Específicamente, el siguiente fragmento de código:
template
struct Hitchhiker {
static_assert(sizeof(answer) != sizeof(answer), "Invalid answer");
};
template
struct Hitchhiker {};
se comporta de manera diferente en Clang y GCC cuando intenta deshabilitar la creación de instancias de plantillas generales usando static_assert. Clang desencadena el error de afirmación incluso cuando no se crea una instancia de la plantilla, mientras que GCC solo genera el error al crear una instancia con un valor de parámetro distinto de 42.
Para comprender la discrepancia, exploremos la sección relevante del estándar C ( [temp.res]/8):
If no valid specialization can be generated for a template, and that template is not instantiated, the template is ill-formed, no diagnostic required.
De acuerdo con esta regla, la plantilla principal Hitchhiker está mal formada ya que no se puede generar una especialización válida. Como tal, no es necesario emitir un diagnóstico. Sin embargo, Clang opta por proporcionar un diagnóstico a pesar de la falta de requisitos.
Si la intención es restringir la creación de instancias a solo 42, el enfoque recomendado es omitir la definición de plantilla general de la siguiente manera:
template
struct Hitchhiker {};
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