Rückgabetypabzug mit Multi-Statement-Lambdas

8

Ich habe Code geschrieben, und ich habe kürzlich herausgefunden, dass g ++ mich nicht vor einer bestimmten Klasse von Problemen warnt: Nach C ++ 11 5.1.2.4, wenn Ihr Lambda dann keine einzige Return-Anweisung ist Der Rückgabetyp muss als Trailing-Return-Typ deklariert werden oder void sein.

Obwohl g ++ ungültigen Code kompilieren darf, wenn es genug Sinn ergibt, gibt es eine Möglichkeit, dieses Verhalten entweder auszuschalten (erlaubt mit -fpedantic in g ++ - 4.7) oder alle davor warnen?

Beispielcode:

%Vor%

C ++ 11 5.1.2.4

  

Eine Implementierung darf keine Member vom Rvalue-Referenztyp zum Closure-Typ hinzufügen.   Wenn ein Lambda-Ausdruck keinen Lambda-Deklarator enthält, ist es so, als wäre der Lambda-Deklarator (). Wenn ein Lambda-Ausdruck keinen Trailing-Return-Typ enthält, ist es als ob der Trailing-Return-Typ den folgenden Typ bezeichnet:

     

- wenn die zusammengesetzte Aussage die Form hat   {attribute-specifier-seq (opt) Rückgabeausdruck; }
  der Typ des zurückgegebenen Ausdrucks nach lvalue-to-rvalue-Konvertierung (4.1), array-to-pointer-Konvertierung (4.2) und function-to-pointer-Konvertierung (4.3);

     

- sonst, void.

    
OmnipotentEntity 22.01.2013, 02:27
quelle

2 Antworten

11

Das liegt daran, dass es sich um einen Fehler im Standard handelt, der geändert wird (siehe DR 975 ):

  

975 Einschränkungen für Rückgabetyp Abzug für Lambdas

     

Es scheint keine technischen Schwierigkeiten zu geben   die aktuelle Einschränkung verlangen, dass der Rückgabetyp eines Lambda   nur dann abgeleitet werden, wenn der Körper des Lambda aus einem einzigen Ertrag besteht   Erklärung. Insbesondere könnten mehrere Return-Statements sein   zulässig, wenn alle den gleichen Typ zurückgeben.

Ich bezweifle, dass es eine Möglichkeit gibt, es auszuschalten.

    
Jesse Good 22.01.2013, 02:35
quelle
1

GCC 4.8.1 (und möglicherweise früher) und clang 3.3 implementiert es bereits; Fixing DR975.

Es gibt jetzt einen Vorschlag ( Ссылка ) zu hol es in C ++ 1y

    
Bulletmagnet 15.10.2013 09:19
quelle