GCC-Standardwerte Wenn "declltype" in Nested Lambda verwendet wird

9

Ich habe ein Makro erstellt, das bequem Lambda-Funktionen erstellt, mit denen ich durch Tensor-Objekte in einer Bibliothek, die ich geschrieben habe, iterieren kann. Das Verschachteln dieser Makros scheint jedoch zu bewirken, dass GCC einem internen Segmentierungsfehler unterliegt. Nach dem Erweitern der Präprozessorausgabe des Compilers und dem Durchlaufen von Versuch und Irrtum, entdeckte ich, dass die Ursache die Verwendung von decltype in der Parameterliste einer verschachtelten Lambda-Funktion ist, die in der Methode einer Klasse oder Struktur deklariert ist. Unten folgt ein minimales Beispiel mit der Standardbibliothek.

%Vor%

Compiler-Ausgabe:

%Vor%

Ich habe mich anfangs für decltype entschieden, weil ein Objekt an einen Makro übergeben wird und ich den Typ des Objekts extrahieren muss. Vom Typ des Objekts ( T , T& oder T* ) würde ich eine Merkmalsklasse verwenden, um T::size_type. size_type zu ziehen, wäre dann der Typ der Lambda-Funktionsparameter.

Wie kann ich dieses Problem umgehen, ohne vorher den Typ des Lambda-Funktionsparameters mit typedef deklarieren zu müssen? Wenn Sie sich eine andere Lösung vorstellen können, die leicht in einem Makro implementiert werden kann (d. H. Wiederholt kopiert und in die Parameterliste einer Lambda-Funktion eingefügt wird), würde das auch funktionieren.

    
void-pointer 27.01.2012, 06:39
quelle

2 Antworten

0

Dieser Fehler wird gerade behoben und ich denke, dass er bald behoben werden sollte.

    
void-pointer 24.08.2012, 00:12
quelle
1

Als sehr grobe Umgehungslösung für diejenigen, die ähnliche Probleme haben könnten, war die beste Standardlösung, die ich mir ausgedacht habe, das Deklarieren eines typedef im voraus, das Verketten eines GUID-ähnlichen Präfixes (ich empfehle persönlich _qki_zbeu26_w92b27bqy_r62zf91j2n_s0a02_ ) und __LINE__ , um einen verwirrten Unsinn für den Typedef-Namen zu generieren. Mit allem Glück wird dieser Name nicht mit anderen Definitionen kollidieren.

Um sicherzustellen, dass dieselbe __LINE__ verkettet wird, auch wenn der Wistled Name für die Parameter der Lambda-Funktion verwendet wird, muss der Wistled Name von einem Makro generiert werden, dem zunächst ein Makroparameter wie im Code übergeben wird Beispiel unten.

%Vor%

Wenn Sie _foo_MANGLE(__LINE__) als Makroparameter übergeben, stellen Sie bitte sicher, dass es eine zusätzliche Indirektionsebene gibt, sodass _foo_MANGLE(__LINE__) vor der Verwendung ausgewertet wird.

    
void-pointer 27.01.2012 08:37
quelle

Tags und Links