Visual Studio: Rückgabetyp von std::type_info::before()



  • Weiss jemand, weshalb die Funktion, welche laut C++-Standard bool zurückgeben muss, in der Standardbibliothek von Visual Studio 2008 folgende Deklaration hat?

    int std::type_info::before(const type_info& rhs) const;
    

    Ich hätte mir vorstellen können, dass das zur Repräsentation von drei Zuständen wie bei strcmp() dient, doch bei ein paar Tests scheint immer 0 und 1 herauszukommen. MSDN sagt dazu leider nichts Nützliches.

    <a href= schrieb:

    MSDN">There is no link between the collating order of types and inheritance relationships. Use the type_info::before member function to determine the collating sequence of types. There is no guarantee that type_info::before will yield the same result in different programs or even different runs of the same program. In this manner, type_info::before is similar to the address-of (&) operator.

    Ich bin drauf aufmerksam geworden, weil die überaus nervige Warnung

    warning C4800: 'int': Variable wird auf booleschen Wert ('True' oder 'False') gesetzt (Auswirkungen auf Leistungsverhalten möglich)

    auftrat. Warum lässt die sich eigentlich nicht durch einen expliziten Cast entfernen? Es gefällt mir nicht besonders, wenn ich portablen Code mit #ifdef _MSC_VER und #pragma warning verschmutzen muss... 😉



  • Warum das mit type_info::before so ist: keine Ahnung.

    Zur Warning: warum ein static_cast<bool>(i) nicht hilft hab ich mich auf gefragt. Was funktioniert ist i != 0 oder der C-Klassiker "double bang" (" !!i ").



  • An i != 0 habe ich auch gedacht, aber das würde mich beim späteren Lesen wahrscheinlich nur verwirren. Der "Double-Bang" ist eine gute Möglichkeit. 🙂

    Vielleicht noch mit Kommentar, damit ich ihn beim nächsten Mal nicht wieder entferne. Danke!


  • Mod

    Hier ist nicht korrekt implementiert worden. Bzgl VS-2010 habe ich mal bei der Produkgruppe angefragt.



  • Ah, vielen Dank für die Aufklärung.

    Nur aus Interesse: Wäre es denn ein Problem, diesen Fehler nachträglich (per Update oder so, wie z.B. beim SP1 mit TR1) noch zu beheben? Ich denke mal, es gibt nicht allzu viel Code, der sich auf den Rückgabetypen int verlässt, zumal eh nur 0 und 1 zurückgegeben wird... Oder würde man damit viele LIBs und DLLs wegen geändertem Binärcode unbrauchbar machen?



  • Bei nem Service-Pack oder nem wichtigen Update werden soweit ich weiss neue Runtime-DLLs installiert, parallel zu den alten.

    Nur neu compilierte Sachen verwenden dann die neuen DLLs, altes Zeug verwendet nach wie vor die alten DLLs.


  • Mod

    Da sich die Signaturen ändern würden gehe ich davon aus, dass so etwas nicht in einem Servicepack ändert...



  • Danke für eure Antworten.

    Martin Richter schrieb:

    Da sich die Signaturen ändern würden gehe ich davon aus, dass so etwas nicht in einem Servicepack ändert...

    Prinzipiell oder wegen "Abwärtskompatibilität" (welche hier ja nicht wirklich relevant ist)? Es wäre schade, wenn solche Fehler ewig weiterexistierten... Du sagst, bei Visual Studio 2010 sieht es noch gleich aus?


  • Mod

    Definitiv ist das Problem für 2010 noch drin.
    Ich habe jetzt einen Bug gefiled, damit das in jedem Fall für VC11 behoben wird.

    Ihr könnt gerne ein Vote abgeben. Das macht etwas mehr Druck:
    https://connect.microsoft.com/VisualStudio/feedback/details/596771/type-info-before-returns-type-of-int-and-not-bool

    Wenn ich etwas neues von der Produktgruppe erfahre melde ich mich, evtl. schreibe ich noch was in meinem Blog...

    Das dies in ein SP einfließen wird bezweifle ich ganz schwer. Ich habe schon ganz andere Bugs gemeldet, die es nicht mal wert waren dass man einen Hotfix erzeugt.
    Und wenn es gefixed würde, dann wäre ich wirklich extrem überrascht.



  • Schön, dass du dich persönlich darum bemühst. Ich habe jetzt abgestimmt (natürlich dafür). 🙂


  • Mod

    Wenn die Dinge so klar sind, dann ist es ja kein großes Ding! 😉



  • Ich glaube auch nicht dass die das in einem SP/Hotfix beheben werden, weil es ja eigentlich kaum ein Problem ist.
    Müsste schon jemand mit Overload-Resolution und/oder Templates rumhantieren dass dabei was rauskommt was nicht passen würde. Abgesehen von einer Warning, die man ja einfach abstellen, ignorieren oder eben durch != 0 unterdrücken kann.

    Was die Änderung der Signatur angeht: da hat es in Service-Packs glaube ich schon gröbere Änderungen gegeben. Ich erinnere mich da z.B. an den Iostream Bug (Memory Leak, glaube der Bug war in 2005 RTM und wurde in SP1 behoben).

    Aber jetzt wo du das schreibst, ich muss direkt mal gucken was aus "meinem" typeid() vs. ADL Bug geworden ist 🙂



  • Wenn ich Martin mal vorausgreifen darf: Die Produktgruppe hat sich gemeldet und es wird wohl in VC11 gefixed werden...



  • Vielen Dank für all eure Bemühungen!

    Ich hätte ehrlich gesagt nicht gedacht, tatsächlich was zu bewirken... 😉



  • Hi,

    in VS 2010 the implentation still seems to be wrong.

    To get rid of that warning I used:

    inline bool before (const type_info & rhs) const
    {
      assert(m_pInfo);
      return ( ((int) m_pInfo->before(rhs)) == (int)(true) ); 
    }
    

    This will function with both implementations:

    bool std::before (const type_info & rhs); // returns 1, 0
    int std::before (const type_info & rhs); // returns true, false



  • @sendel
    == (int) true finde ich nicht gut, ich würde einfach mit != 0 testen.
    Ein int gilt auch als true wenn er 2, 3, ... ist, mit == (int) true kommt aber für alles ausser 1 false raus. Was vermutlich nicht das ist was man ausdrücken wollte.


Anmelden zum Antworten