RTTI für eine verschachtelte Klasse, VS Bug?

8

Die folgenden Code-Ausgaben:

struct Property<int>::IValue

Aber ich würde erwarten, dass es ausgibt:

struct Property<int>::Value<int>

Code:

%Vor%

Wenn IValue und Value außerhalb von Property verschoben werden, so dass sie keine verschachtelten Klassen mehr sind, bekomme ich die erwarteten Ergebnisse. Ist das ein VS Bug oder erwartetes Verhalten?

    
David 28.01.2013, 16:05
quelle

1 Antwort

4

Dies ist definitiv ein Visual C ++ - Compilerfehler. Aus irgendeinem seltsamen Grund kann der Compiler nicht feststellen, dass Property<T>::IValue dereferenziert von shared_ptr eine polymorphe Basisklasse ist und statische Typinformationen für typeid expression anstelle von runtime type info verwendet.

Minimaler Code, um den Fehler zu reproduzieren:

%Vor%

Ich spielte ein wenig mit diesem Beispiel und entdeckte, dass typeid erwartungsgemäß funktioniert und den Namen des Laufzeittyps anzeigt, wenn eine Funktion von einem spitzen Objekt vor typeid aufgerufen wird oder wenn shared_ptr durch% co_de ersetzt wird %. Lustig, aber das Ersetzen von unique_ptr durch shared_ptr<IValue> reproduziert den Fehler immer noch!

Tatsächliche Ausgabe:

%Vor%

Erwartete (korrekte) Ausgabe:

%Vor%

Aus dem Assembler-Listing wird deutlich, dass es sich wirklich um ein Compiler-Problem handelt:

IValue* aufgerufen von typeid ctor erzeugt einen ehrlichen Aufruf an Property :

%Vor%

__RTtypeid extern aufgerufen erzeugt statische typeid type info:

%Vor%

Beachten Sie auch, dass derselbe Fehler in VS2008 auftritt, also ist es ein altes Zeitverhalten.

    
Rost 31.01.2013, 20:10
quelle

Tags und Links