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?
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
:
__RTtypeid
extern aufgerufen erzeugt statische typeid
type info:
Beachten Sie auch, dass derselbe Fehler in VS2008 auftritt, also ist es ein altes Zeitverhalten.
Tags und Links c++ visual-studio-2010