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?
c++
c++20
c++-concepts
metalfox
la source
la source
Resize
etEziser
doivent être rejetés) ou les deux fonctions devraient être compilées. Je dirais que clang a raison.Réponses:
Oui, une expression require peut utiliser tout ce qui est dans la portée. Il n'a besoin que du type de tout ce qu'il nomme, après tout, sauf dans une exigence imbriquée ou une autre expression constante. Cela vaut autant pour les déclarations environnantes que pour ses propres paramètres (formels).
[expr.prim.req] / 5 :
la source