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

Programmiersprachen, APIs, Bibliotheken, Open Source Engines, Debugging, Quellcode Fehler und alles was mit praktischer Programmierung zu tun hat.
Antworten
Benutzeravatar
Krishty
Establishment
Beiträge: 8268
Registriert: 26.02.2009, 11:18
Benutzertext: state is the enemy
Kontaktdaten:

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

Beitrag 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!
Zuletzt geändert von Krishty am 28.11.2010, 19:56, insgesamt 2-mal geändert.
seziert Ace Combat, Driver, und S.T.A.L.K.E.R.   —   rendert Sterne
Benutzeravatar
Aramis
Moderator
Beiträge: 1458
Registriert: 25.02.2009, 19:50
Echter Name: Alexander Gessler
Wohnort: 2016
Kontaktdaten:

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

Beitrag 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.
Benutzeravatar
Krishty
Establishment
Beiträge: 8268
Registriert: 26.02.2009, 11:18
Benutzertext: state is the enemy
Kontaktdaten:

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

Beitrag 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.
seziert Ace Combat, Driver, und S.T.A.L.K.E.R.   —   rendert Sterne
Alexander Kornrumpf
Moderator
Beiträge: 2119
Registriert: 25.02.2009, 13:37

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

Beitrag 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
Benutzeravatar
Krishty
Establishment
Beiträge: 8268
Registriert: 26.02.2009, 11:18
Benutzertext: state is the enemy
Kontaktdaten:

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

Beitrag 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.
Zuletzt geändert von Krishty am 28.11.2010, 19:54, insgesamt 2-mal geändert.
seziert Ace Combat, Driver, und S.T.A.L.K.E.R.   —   rendert Sterne
Alexander Kornrumpf
Moderator
Beiträge: 2119
Registriert: 25.02.2009, 13:37

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

Beitrag von Alexander Kornrumpf »

Ich wusste, so einfach kann die Lösung nicht sein :)
Benutzeravatar
Krishty
Establishment
Beiträge: 8268
Registriert: 26.02.2009, 11:18
Benutzertext: state is the enemy
Kontaktdaten:

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

Beitrag 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.
seziert Ace Combat, Driver, und S.T.A.L.K.E.R.   —   rendert Sterne
Antworten