Sind in Konzeptdefinitionen Substitutionsfehler außerhalb eines erforderlichen Ausdrucks zulässig?

8

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?

    
rnickb 05.12.2015, 17:55
quelle

1 Antwort

4

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.

    
Casey 06.12.2015, 00:19
quelle

Tags und Links