2015-02-10 9 views
13

Ich habe ein Stück Code, den Gültigkeitsbereich sein, die unter VS2015 ausfällt, arbeitet aber unter GCC. Ich bin mir ziemlich sicher, dass der Fehler mit Visual Studio ist aber will sicher sein, dass mein Verständnis von decltype (auto) korrekt ist.destructor vor vorübergehend genannt sollte

Unter Visual Studio wird die von zero_params zurückgegebene Zeichenfolge als R-Wert-Referenz abgeleitet. Das Weiteren der destructor dieses Objekt innerhalb test1() aufgerufen, wo die Rückkehr von dem Aufruf von f passiert (was einen angemessenen Ort scheint ein & & Objekt zu zerstören).

Unter GCC wird die Zeichenfolge zurückgegeben nicht abgeleitet rvalue Referenz. Der Destruktor wird nach der Verwendung in der cout-Anweisung wie erwartet aufgerufen.

Die Angabe des Rückgabetyps, der in Visual Studio anstelle von declltype (auto) als 'string' definiert ist, behebt es, ebenso wie remove_reference_t bei der Rückgabe von f() innerhalb von test1.

Meine Erwartung wäre, dass GCC korrekt ist, wie die Funktionssignatur für zero_params() String ist, nicht String & & so würde ich das nicht-Verweis auf ‚sprudeln‘ erwarten den Rückgabetyp von test1 wenn es decltype verwendet (Auto).

Ist das eine richtige Einschätzung?


LATE EDIT:

Ein anderer Weg, die ich gefunden habe, um dieses mit VS2015 zu bekommen, ist die Funktion gegeben wickeln in einem Lambda-Test1:

cout << test1(zero_params) << endl; 

zu:

cout << test1([](auto&&... ps) { return zero_params(std::forward<decltype(ps)>(ps)...); }) << endl; 
+5

Richtig, 'f()' ist ein prvalue, so sollte "declltype" statt 'std :: string &&' 'std :: string' ableiten. –

+3

Bitte melden Sie einen Fehlerbericht auf [MS Connect] (https://connect.microsoft.com/VisualStudio/) und veröffentlichen Sie den Link hier. Dieses _really_ muss behoben werden, bevor VS2015 zu RTM geht, wenn 'declltype (auto)' etwas anderes als nutzlos sein soll ... – ildjarn

+0

Leider sagt MS Connect mir, dass ich nicht berechtigt bin, Fehlerberichte einzureichen. Innerhalb von Visual Studio habe ich jedoch bereits die nächstbeste Sache gemacht - Feedback mit dem "frowny face" eingereicht, inklusive Screenshot des Testcodes mit Beschreibung. Leider glaube ich nicht, dass diese Methode verfolgbar ist? Hoffentlich übergibt jemand es an die richtige Abteilung – qeadz

Antwort

2

So based on the comments können wir schließen:

Der Fehler ist, dass:

  • Der Compiler den Rückgabetyp String sein gefolgert haben sollte
  • es abgeleitet tatsächlich Zeichenfolge & & sein
  • So zerstört er den Wert vorzeitig

Die Abhilfen sind:

  • Verwenden decltype nicht (auto) für den Rückgabetyp der Funktion
  • Wickeln Sie die Funktion in einem Lambda-Ausdruck, bevor er es in
+0

ändern Können wir diese Kommentare in diese Antwort integriert bekommen? Kommentare sind temporär. –

+1

https://connect.microsoft.com/VisualStudio/feedback/details/1124457/decltype-auto-deducing-wrong-type-in-some-cases –

Verwandte Themen