2014-02-06 4 views
7

diesen Code-Schnipsel vor:(Default) konstruiert ein Objekt für jeden variadische Typen

void Foo(std::string str1, std::string str2) {} 

template<typename... Types> 
void Bar() 
{ 
    Foo(Types{}...); // wont compile 
} 

Bar<std::string, std::string>(); 

Was will ich hier zu tun ist, auf dem Standard zwei std::string Objekte innerhalb der Bar Methode zu konstruieren und sie Foo passieren. Allerdings werden meine vergeblichen Versuche (einer von ihnen ist im Schnipsel) nicht kompiliert, also frage ich mich, ob das überhaupt möglich ist.

Ich kompiliert mit VC 2013, die Compilerfehler bei mir wirft. Wie in den Kommentaren erwähnt, können andere Compiler damit umgehen. Kann jemand sagen, ob das obige Snippet standardkonform ist?

+6

[Works für mich ...] (http://coliru.stacked-crooked.com/a/d4fac91bb71f75f3) – 0x499602D2

+2

@ 0x499602D2 Interessant, versuchte Ihren Code mit VC 2013 und dort schlägt es fehl (wie von mir zuvor beobachtet) , könnte ein Compiler-Bug sein, dann – Paranaix

+0

funktioniert auf clang 3.5 auch, was ist dein Compiler und Version? – galop1n

Antwort

8

Es ist ein Problem in der MSVC variadic Vorlage Expansionsvorgang; Wenn es die Typenliste entpackt, erkennt es sie nicht als geeignet für einen Konstruktoraufruf. Als Abhilfe können Sie eine Art Transformation durchführen, den Compiler zu zwingen, sie zu erkennen:

template<typename T> using identity_t = T; // NEW CODE 

void Foo(int, int); 

template<typename... Types> 
void Bar() 
{ 
    Foo(identity_t<Types>{}...); // use identity type transformation 
} 

int main() { 
    Bar<int, int>(); 
} 

Ich habe eine Frage Ihnen noch nicht geschafft.

+2

'Vorlage mit identity_t = T;' funktioniert auch und nicht 'typname 'und' :: type' Dekoration. – galop1n

2

Das stürzt den VC 2013-Compiler für mich ab. Die Fehler scheinen darauf hinzuweisen, dass es beim Parsen des Codes Probleme gibt. Wenn der Compiler abstürzt, muss es daher ein Compiler-Fehler sein.

1>main.cpp(23): error C2144: syntax error  : 'std::string' should be preceded by ')' 
1>   main.cpp(28) : see reference  to function template instantiation 'void Bar<std::string,std::string>(void)' being compiled 
1>main.cpp(23): error C2660: 'Foo' :  function does not take 0 arguments 
1>main.cpp(23): error C2143: syntax error  : missing ';' before '{' 
1>main.cpp(23): error C2143: syntax error  : missing ';' before ',' 
1>c1xx : fatal error C1063: INTERNAL COMPILER ERROR 
1>   Please choose the Technical Support command on the Visual C++ 
1>   Help menu, or open the Technical Support help file for more information 
1>cl : Command line warning D9028: minimal rebuild failure, reverting to normal build 
1> 
1>Build FAILED. 
+0

MSVC wirklich saugt. Microsoft wird die C++ 11-Implementierung für 2017 abschließen ... – Manu343726

+0

@ Manu343726 Nicht wahrscheinlich, wenn man bedenkt, dass sie die Implementierung von C++ 98-Funktionen noch nicht abgeschlossen haben und sie 16 Jahre Zeit hatten, an dieser Standardrevision zu arbeiten. – Casey

Verwandte Themen