Ist es eine nicht standardmäßige std :: pair-Implementierung, ein Compilerfehler oder ein nicht standardmäßiger Code?

8

Der folgende Code wird auf VS2005 und gcc-4.3.4 kompiliert.

%Vor%

Aber es kann nicht auf VS2010 mit der Fehlermeldung kompiliert werden:

%Vor%

Ich verstehe, dass in Microsoft-Implementierung von VS2010 Pr::first tatsächlich ein Mitglied von _Pair_base ist. AFAIK spielt jedoch keine Rolle. &Pr::first muss weiterhin vom Typ int Pr::* sein. Beachten Sie, dass der folgende Code gut kompiliert:

%Vor%

Also, ist es eine nicht standardmäßige std :: pair-Implementierung, ein Compiler-Bug oder ein nicht standardmäßiger Code?

    
ybungalobill 06.05.2011, 07:42
quelle

3 Antworten

8

Der Standard bietet eine klare Definition dessen, was ein Paar ist, sowohl in C ++ 03 als auch in C ++ 11, wobei das Paar zwei Mitgliedsattribute enthält, und liefert genauen Code, wie ein Paar aussieht. Ich würde dieses Verhalten (das Verschieben der Mitglieder in eine Basisklasse) als Vertragsbruch betrachten, da Ihr Code gemäß dem Standard gültig ist und von der Implementierung abgelehnt wird.

Daher ist die Implementierung von VC2010 nicht standardkonform in diesem speziellen Fall.

    
David Rodríguez - dribeas 06.05.2011, 08:00
quelle
4

Der Standard lässt keine Konvertierung zu, wenn die Template-Parameter übereinstimmen (die Suche nach dem Standard-Absatz wird bearbeitet).

%Vor%

Dies setzt X als ( std:: wird der Kürze wegen weggelassen)

%Vor%

Aber der statische Typ von &Pr::first ist

%Vor%

Der Compiler müsste also eine Konvertierung durchführen, wie sie im Fehler angezeigt wird. Ich weiß nicht genau, wie gcc std::pair implementiert, aber es scheint so ohne Vererbung zu sein. Ich werde es nachschlagen und erneut bearbeiten.

    
Xeo 06.05.2011 07:48
quelle
1

Ja, es ist ein Fehler. Habe den Fehlerbericht hier gefunden:

Ссылка

    
ybungalobill 08.05.2011 07:13
quelle

Tags und Links