Betrachten Sie diesen Code:
%Vor%GCC kompiliert es gut und druckt 10.
Aber §14.10.1.2 Prädikative Einschränkungen [temp.constr.pred] von N4553 sagt
Eine Prädikatbeschränkung ist eine Einschränkung, die einen konstanten Ausdruck E (5.19) auswertet.
und dann
Nach der Substitution muss E den Typ bool haben.
Da C1<decltype(std::declval<A>() + std::declval<A>())>
ein Substitutionsfehler ist und nicht den Typ bool, bedeutet das, dass das Programm schlecht gebildet sein sollte?
Die Konzepte TS definiert nur das Verhalten zum Ermitteln der Erfüllung der zugehörigen Einschränkungen einer Deklaration; Es gibt keine Möglichkeit, auf einen Konzeptnamen außerhalb der zugehörigen Einschränkungen zu verweisen. Genau genommen sind std::cout << C<int>
und std::cout << C<A>
beide schlecht ausgebildet.
EWG hat in Kona beschlossen, dies als neues Feature zuzulassen:
Strohumfrage: SF | F | N | A | SA
- Sollten wir die Bewertung von Konzepten überall erlauben? 8 | 6 | 2 | 0 | 0
- Sollen wir das Vorhandensein und die Bewertung eines Require-Ausdrucks in einem Ausdruck zulassen? 1 | 2 | 10 | 3 | 1
- Beachten Sie, dass sich die zweite Umfrage ohne die erste Umfrage ändern würde.
aber es gibt noch keine Formulierung, um sein Verhalten zu spezifizieren.
GCC erlaubt derzeit Konzepte als Ausdrücke als eine (ich undokumentierte) Erweiterung. Ich finde es sehr wahrscheinlich, dass dieses Feature so angegeben wird, dass C<X...>
zu false
ausgewertet wird, wenn die Ersetzung von X...
in den Initialisierer von C
keinen gültigen Ausdruck erzeugt und ansonsten den Wert des Ausdrucks so hat erhalten. Das scheint der vernünftige Weg dafür zu sein und steht im Einklang mit der Umsetzung im GCC.
Tags und Links c++ c++-concepts c++17