Dans l'exemple suivant, les arguments de fonction sont utilisés pour tester avec une expression require si une expression les utilisant est bien formée. L'expression require ne prend aucun argument; il utilise directement les variables de la portée de la fonction:
#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);
}
Le code ci-dessus se compile avec la branche Clang concepts. Cependant, GCC10 accepte uniquement l'appel à Resize
. ICE GCC9. Clang a-t-il raison de l'accepter?
Resize
et Eziser
doivent être rejetés) ou les deux fonctions devraient être compilées. Je dirais que clang a raison.