El compilador no puede ejecutar la expresión constexpr.
Tengo un código algo así:
template<typename ...="" args="">
constexpr sizet getinit_size(Args ... args) {
return sizeof...(Args);
}
template<typename ...="" args="">
constexpr auto makegenericheader(Args ... args) {
constexpr sizet headerlenght = getinitsize(args...);
return header_lenght;
}
constexpr auto createipv4header() {
constexpr auto x = makegenericheader(0b01, 0b10, 0b01);
return x;
}
Sé que es un código de prueba, pero lo aislé para encontrar el error.
El compilador me da el error (GCC):
En la instancia de ‘constexpr auto make_generic_header(Args &&…) [con Args = {int, int, int}]’:
/tmp/tmp.CaO5YHcqd8/network.h:39:43: requerido de aquí
/tmp/tmp.CaO5YHcqd8/network.h:31:22: error: ‘args#0’ no es una expresión constante
31 | constexpr size_t header_lenght = get_init_size(args…);
| ^~~~~~~~~~~~~
Intenté agregar el calificador const a los parámetros de la función, pero no funciona. En teoría, toda esta función se puede calcular en tiempo de compilación. Pero donde está el problema, no puedo encontrarlo con mi conocimiento.
davy.ai
Parece que el compilador está teniendo problemas con la función
get_init_size
. El parámetroargs
no está siendo reconocido como una expresión constante, lo cual es necesario para que la función sea evaluada en tiempo de compilación. Para solucionarlo, puedes agregar el calificadorconst
al parámetroargs
en la funciónget_init_size
:plantilla
constexpr size_t get_init_size(const Args ... args) {
return sizeof...(Args);
}