Pourquoi avons-nous besoin nécessite?

L'un des coins de C++20 concepts est qu'il y a certaines situations dans lesquelles vous devez écrire requires requires. Par exemple, cet exemple de [expr.prim.req]/3:

Un nécessite expression peut également être utilisé dans un exige la clause ([temp]) comme un moyen de rédaction ad hoc des contraintes sur le modèle des arguments tels que celui ci-dessous:

template<typename T>
  requires requires (T x) { x + x; }
    T add(T a, T b) { return a + b; }

La nécessite d'abord introduit la exige la clause, et la seconde partie présente le nécessite expression.

Qu'est-ce que la technique la raison derrière le besoin de deuxième requires mot-clé? Pourquoi ne peut-on pas autoriser l'écriture:

template<typename T>
  requires (T x) { x + x; }
    T add(T a, T b) { return a + b; }

(Note: veuillez ne pas répondre que de la grammaire requires c')

  • Semble requires peut être utilisé pour la méthode de la classe de modèle, et il serait "ambigu" template <typename T> struct S {void f(T t) requires requires (T x) {x + x;} { t + t;} };
  • Suggestion: "Est-il rien qui exige exige exige?". Plus sérieusement, j'ai l'intuition que c'est la même raison derrière noexcept(noexcept(...)).
  • Ils disent que "Le nécessite tout d'abord introduit la nécessite de la clause, et la seconde partie présente la nécessite d'expression.", mais ce n'est pas compatible avec la grammaire, ils donnent juste au-dessus
  • Avec noexcept il y a ambiguïté. noexcept(f()) pourrait signifier pour être noexcept si f() prend la valeur vrai ou si f() est noexcept.
  • Bien, alors, n'est-ce pas la même raison ici? Un requires clause peut avoir n'importe quel constexpr prédicat, non?
  • Une raison que je vois pour le faire, c'est de rendre l'analyse plus facile. Lorsque le compilateur voit requires il sait le prochain symbole est l'exigence, de sorte que nous avons besoin de la supplémentaires requires à dire qu'il doit analyser cette exigence ad-hoc exigence.
  • Les deux requires sont des homonymes à mon avis: ils ont le même aspect, sort la même, la même odeur, mais sont intrinsèquement différents. Si je devais proposer un correctif, je vous suggère de renommer l'un d'eux.
  • Apparemment oui, comme l'a démontré par NicolBolas, bien que dans une moindre mesure.
  • co_requires? (Désolé, pas pu résister).
  • Où va la folie arrêter? La prochaine chose que vous savez, nous aurons long long.
  • nécessite nécessaire?" aurait été encore plus allitératifs!!
  • Ce n'est pas un burnination demande lol
  • Il est logique gramatically, bizarrement assez. add<T>() nécessite un T qui exige à son tour la capacité d'être ajouté à d'autres Ts. Ainsi, alors qu'il semble répétitif, c'est logique, si vous pensez à ce sujet assez. (Où "je dois être addable" est l'expression, et "la fonction a besoin de quelque chose qui doit être addable" est la contrainte.)
  • Parce que require nécessite requires requires. Désolé, je ne pouvais pas résister.
  • je ne regarde jamais la parole exiger la même chose de nouveau
  • et puis nous avons modèle des paramètres de modèle...
  • A la question de savoir pourquoi avons-nous besoin nécessite requis requis? (Dang, maintenant, je suis en train de réfléchir buffalo ...)
  • dans l'Ouest-de-l'Angleterre rurale accent on pourrait même dire "Pourquoi ne nous exige exige exige?" 😉
  • Merci pour ce mal de tête... je n'ai pas besoin...
  • Par l'imbrication requires clauses/expressions que vous obtenez de drôles de constructions. void Fn() requires requires () { requires requires () { requires true; }; } {} est une contrainte de fonctionner.

InformationsquelleAutor Barry | 2019-01-15