es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

Llamada anidada de funciones consteval con un argumento de referencia.

El siguiente programa

template<class T>
consteval auto foo(const T&) {
   return 0;
}

<p>template<class T>
consteval auto bar(const T& t) {
   auto n = foo(t);
   return n;
}</p>

<p>int main() {
   static<em>assert(foo("abc") == 0);
   static</em>assert(bar("abc") == 0);
}
<code>
se compila bien en GCC, pero Clang lo rechaza con los mensajes:
</code>
error: la llamada a la función consteval 'foo<char[4]>' no es una expresión constante
nota: en la instanciación de la especialización de plantilla de función 'bar<char[4]>' que se solicitó aquí
   static_assert(bar("abc") == 0);
nota: el parámetro de la función 't' con valor desconocido no se puede usar en una expresión constante
   auto n = foo(t);

Demo: https://gcc.godbolt.org/z/M6GPnYdqb

¿Es algún error en Clang?

Tags:  , , ,

Answer

  1. Avatar for davy.ai

    No es un error en Clang. La función foo está marcada como consteval, lo que significa que debe ser invocada con una expresión constante. Sin embargo, en la función bar, el parámetro t no es una expresión constante, por lo que cuando se llama a foo(t), no se puede compilar en Clang. Esto se debe a que Clang es más estricto al hacer cumplir el requisito de consteval en comparación con GCC. Para solucionar el código, haga que t sea una expresión constante o quite el especificador de consteval defoo.

Comments are closed.