Seite 1 von 1

(gelöst)[C++] Implementierung von std::move()

Verfasst: 28.11.2010, 15:21
von Krishty
Hi,

So ist std::move in der STL von Visual C++ implementiert (der C-Cast evaluiert zu static_cast):

Code: Alles auswählen

	template<class _Ty> inline
	typename tr1::_Remove_reference<_Ty>::_Type&&
		move(_Ty&& _Arg)
	{ return ((typename tr1::_Remove_reference<_Ty>::_Type&&)_Arg); }
und so in der von GCC 4.5 (Include-Ordner heißt mingw32\4.4.1):

Code: Alles auswählen

  template<typename _Tp>
    inline typename std::remove_reference<_Tp>::type&&
    move(_Tp&& __t)
    { return __t; }
Jede Implementierung führt unter dem jeweils anderen Compiler zu
warning: returning reference to temporary
bzw.
error C2440: 'return' : cannot convert from 'x' to 'x&&'
    You cannot bind an lvalue to an rvalue reference


Visual C++’ Meldung kann ich nachvollziehen – ist es ja ein fundamentales Konzept, dass benannte rvalue References immer als lvalue References behandelt werden –, GCCs nicht.
Was läuft falsch; wie sähe eine fehlerfreie bzw. unter beiden kompilierbare Implementierung aus?

Gruß, Ky

Und danke an Cat für die „Ansicht erweitern“-Buttons!

Re: [C++] Implementierung von std::move()

Verfasst: 28.11.2010, 15:38
von Aramis
Was läuft falsch; wie sähe eine fehlerfreie bzw. unter beiden kompilierbare Implementierung aus?
Ich denke auch dass die VC-Implementierung richtig liegt (davon abgesehen dass ein static_cast zu bevorzugen waere – evtl. verschwindet damit dann auch die GCC–Warnung?).

Hier z.b. ist es gleich implementiert: http://thbecker.net/articles/rvalue_ref ... on_08.html. Einen interessanten Hinweis gibt aber der dortige Hinweis im Quellcode:
// NOTE: Reference implementations that are based on versions of the C++0x draft Standard
// predating the spring of 2009 do not need the static_cast above, because the lvalue a
// will happily bind to the rvalue reference that is the result type.

Re: [C++] Implementierung von std::move()

Verfasst: 28.11.2010, 15:52
von Krishty
static_cast ändert nichts an der Warnung. Aber der Kommentar ist wirklich interessant … das Dokument, das bei GCCs C++0x-Status verlinkt ist, scheint auf 2006 datiert zu sein. Wenn dem so ist, empfinde ich die Tabelle als leicht irreführend :roll:

Also verlasse ich mich einfach mal darauf, dass die Warnung in späteren GCC-Builds verschwindet. Danke.

Re: [C++] Implementierung von std::move()

Verfasst: 28.11.2010, 15:59
von Alexander Kornrumpf
Ich traue mich ja kaum zu fragen, aber hast du vielleicht das amerikanische Datum "2010-11-06" als Jahr 2006 statt Jahr 2010 geparst?
Copyright (C) Free Software Foundation, Inc.
Verbatim copying and distribution of this entire article is permitted in any medium, provided this notice is preserved.
Last modified 2010-11-06

Re: [C++] Implementierung von std::move()

Verfasst: 28.11.2010, 16:00
von Krishty
Ganz oben bei Rvalue references / N2118 / GCC 4.3
Document number: N2118=06-0188
Howard E. Hinnant
2006-10-19
Vllt befasst sich noch ein anderes der aufgeführten Proposals mit den Regeln für rvalue-to-lvalue-Konvertierungen und ist neueren Datums, aber atm finde ich keins.

Edit: Microsofts Tabelle verweist auf Rvalue references v2 von März 2009.

Re: [C++] Implementierung von std::move()

Verfasst: 28.11.2010, 16:08
von Alexander Kornrumpf
Ich wusste, so einfach kann die Lösung nicht sein :)

Re: (erledigt)[C++] Implementierung von std::move()

Verfasst: 28.11.2010, 19:56
von Krishty
Soooo. In GCC 4.5.0 wurde Version 2 übernommen. Ich hatte noch 4.4.1 benutzt; habe mit einem Bisschen Geraffel aktualisiert und nun kommen auch keine Warnungen mehr. Damit wäre ich erstmal im Reinen.