En el siguiente ejemplo, los argumentos de la función se usan para probar con una expresión obligatoria si una expresión que los usa está bien formada. La expresión requiere no toma argumentos; utiliza las variables en el alcance de la función directamente:
#include <cstddef>
#include <vector>
template<typename T>
void Resize(T &v, std::size_t const n)
{
if constexpr (requires { v.resize(n); })
v.resize(n);
}
template<typename T>
void Eziser(T &v, std::size_t const n)
{
if constexpr (requires { v.eziser(n); })
v.eziser(n);
}
int main()
{
std::vector<int> v;
Resize(v, 10u);
Eziser(v, 10u);
}
El código anterior se compila con la rama de conceptos de Clang. Sin embargo, GCC10 solo acepta la llamada a Resize
. GCC9 ICE. ¿Clang tiene razón al aceptarlo?
c++
c++20
c++-concepts
metalfox
fuente
fuente
Resize
, yEziser
debe ser rechazar) o ambas funciones debe compilar. Yo diría que el sonido metálico es correcto.Respuestas:
Sí, una expresión requerida puede usar cualquier cosa que esté dentro del alcance. Después de todo, solo necesita el tipo de cualquier cosa que nombre, excepto en un requisito anidado u otra expresión constante. Eso es cierto tanto para las declaraciones circundantes como para sus propios parámetros (formales).
[expr.prim.req] / 5 :
fuente