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?
davy.ai
No es un error en Clang. La función
foo
está marcada comoconsteval
, lo que significa que debe ser invocada con una expresión constante. Sin embargo, en la funciónbar
, el parámetrot
no es una expresión constante, por lo que cuando se llama afoo(t)
, no se puede compilar en Clang. Esto se debe a que Clang es más estricto al hacer cumplir el requisito deconsteval
en comparación con GCC. Para solucionar el código, haga quet
sea una expresión constante o quite el especificador deconsteval
defoo
.