Warum kann der Clang ++ Compiler den folgenden variadischen Vorlagencode nicht kompilieren?

8
%Vor%

Die Fehlermeldung ist

%Vor%

Der gleiche Code scheint mit G ++ 4.9.2 gut zu kompilieren. Ich konnte noch keinen relevanten Fehlerbericht über Clang finden.

    
Nat 12.05.2015, 21:07
quelle

2 Antworten

10

Scheint ein Clang-Bug zu sein, obwohl das Nachschlagen solcher Pseudodestruktor-Namen wahrscheinlich defekt ist und Gegenstand von offenen CWG-Problemen ist, speziell 555 und 399.

Das signifikante Bit des Erweiterungsmusters ist

%Vor%

Hier ist das Bit zwischen . und () ein Pseudo-Destruktorname ; Die Suche nach einem qualifizierten Namen verlangt dann, dass

  

Wenn ein Pseudo-Destruktor-Name (5.2.4) einen geschachtelten Namen-Spezifizierer enthält,   Die type-name s werden als Typen in dem von der    verschachtelter Name-Specifier . Ähnlich, in einer qualifizierten ID des Formulars:

     

verschachtelte Namenspezifikation opt Klassenname :: ~ Klassenname

     

Der zweite Klassenname wird im selben Bereich wie der erste gesucht.

i.e. type wird in std::tuple_element<I, args_type> gesucht, wo es sich auf einen Typ bezieht. Beachten Sie, dass Klassenname ein grammatikalischer Name für Bezeichner (und einfache Vorlage-ID s) ist und sich nicht auf eine tatsächliche Klasse beziehen muss. std::get<I>(x).std::tuple_element<I, args_type>::type::~type verweist dann auf den Destruktor von type .

Workaround mit einer Hilfsfunktion:

%Vor%     
Columbo 12.05.2015, 21:16
quelle
0

Interessanterweise erwähnt Hstong von IBM ein Paar Problemumgehungen , die besser funktionieren.

%Vor%

oder

%Vor%     
Nat 19.05.2015 04:25
quelle

Tags und Links