C++11 und Narrowing



  • Vielen Dank! Ich denke dass sagt alles 🙂 Mir ging es halt nur darum ein versehentliches Narrowing zu vermeiden. Mir ist ja durchaus bewusst, dass man auf eine Typenumwandlung verzichten sollte und wenn möglich gleich auf die richtigen "Typen" setzen sollte. Aber die Antwort dass es eben ein Fehler ist und gcc noch nicht "soweit" ist genügt mir völlig 👍

    Jonathan



  • http://channel9.msdn.com/Series/C9-Lectures-Stephan-T-Lavavej-Core-C-/STLCCSeries6
    Da gibt's nen Abschnitt über uniform initialization, falls es dich interessiert. 😉


  • Mod

    class_1974 schrieb:

    Sollte hier aber nicht mit einem Fehler bei der Übersetzung abgebrochen werden?

    Das dürfte angesichts der großen Menge alten Codes, der dieses Problem aufweist, unzweckmäßig sein.
    Im Übrigen ist es dem Compiler überlassen, wie auf solche Fehler reagiert wird. Der Standard verlangt lediglich, dass eine entsprechende Diagnosemeldung erfolgt. Und die liegt ja vor.



  • camper schrieb:

    Das dürfte angesichts der großen Menge alten Codes, der dieses Problem aufweist, unzweckmäßig sein.

    Alter Code nutzt nicht diese Syntax.



  • Edit: Hier stand Quatsch.



  • cooky451 schrieb:

    Quatsch.

    Nach dem Edit:

    cooky451 schrieb:

    Edit: Hier stand Quatsch.

    krümelkacker schrieb:

    camper schrieb:

    Das dürfte angesichts der großen Menge alten Codes, der dieses Problem aufweist, unzweckmäßig sein.

    Alter Code nutzt nicht diese Syntax.

    Mit welcher Syntax willst du sonst Arrays initialisieren?



  • krümelkacker schrieb:

    camper schrieb:

    Das dürfte angesichts der großen Menge alten Codes, der dieses Problem aufweist, unzweckmäßig sein.

    Alter Code nutzt nicht diese Syntax.

    Dank euch alle für die Hilfe und den Link 🙂

    Konnte man bei einem alten Code nicht schon diese Syntax verwenden:

    double dval = {123.123}; // ging dass nicht schon vorher?
    

    Bin mir aber nicht 100%ig sicher 😕



  • class_1974 schrieb:

    Konnte man bei einem alten Code nicht schon diese Syntax verwenden:

    double dval = {123.123}; // ging dass nicht schon vorher?
    

    Bin mir aber nicht 100%ig sicher 😕

    Ich bin mir da nicht mehr so sicher. Das ist eine für Aggregate zulässige Initialisierung. Allerdings ist double kein Aggregat-Typ.

    Folgende Syntax ist aber definitiv neu:

    double dval {123.123}; // neue C++11 Syntax
    

    Probier die doch mal aus, ob das einen Fehler gibt oder nur eine Warnung. 🙂



  • krümelkacker schrieb:

    Folgende Syntax ist aber definitiv neu:

    double dval {123.123}; // neue C++11 Syntax
    

    Probier die doch mal aus, ob das einen Fehler gibt oder nur eine Warnung. 🙂

    Hier muss gar nichts konvertiert werden. Ein double -Literal wird einer double -Variable zugewiesen. 🙂



  • Sone schrieb:

    krümelkacker schrieb:

    Folgende Syntax ist aber definitiv neu:

    double dval {123.123}; // neue C++11 Syntax
    

    Probier die doch mal aus, ob das einen Fehler gibt oder nur eine Warnung. 🙂

    Hier muss gar nichts konvertiert werden. Ein double -Literal wird einer double -Variable zugewiesen. 🙂

    Ich mein doch nicht das double-Literal sondern die geschweiften Klammern worum es ja bei der beschränkten automatischen Konvertierung geht. Im alten (nicht C++11)Code konnte man ja dass auch schon "so" verwenden.



  • krümelkacker schrieb:

    class_1974 schrieb:

    Konnte man bei einem alten Code nicht schon diese Syntax verwenden:

    double dval = {123.123}; // ging dass nicht schon vorher?
    

    Bin mir aber nicht 100%ig sicher 😕

    Ich bin mir da nicht mehr so sicher. Das ist eine für Aggregate zulässige Initialisierung. Allerdings ist double kein Aggregat-Typ.

    Folgende Syntax ist aber definitiv neu:

    double dval {123.123}; // neue C++11 Syntax
    

    Probier die doch mal aus, ob das einen Fehler gibt oder nur eine Warnung. 🙂

    Ok ich hab es jetzt nochmals probiert:

    double dval02 = {123.123}; // geht noch mit "altem" Code 
    double dval01 {123.123};   // pures C++11
    

    An dieser Stelle stellt sich für mich nur noch die Frage ob im C++11-Standard die Version mit dem Zuweisungsoperator und ohne trotzdem ein und dasselbe sind 😕 So wie ich dass verstanden habe ist es egal ob ich noch ein = verwende oder nicht?



  • Das eine ist direct-list-initialization, das andere copy-list-initialization (Edit: Die Variante mit dem Zuweisungsoperator ist copy-list-initialization!)

    Für Basisdatentypen macht das natürlich keinen Unterschied, lediglich für Initialisierung von Objekten einer Klasse.



  • Sone schrieb:

    Das eine ist direct-list-initialization, das andere copy-list-initialization.

    Für Basisdatentypen macht das natürlich keinen Unterschied, lediglich für Initialisierung von Objekten einer Klasse.

    Vielen Dank für die Info. Damit habt ihr für mich das komplette Thema "Narrowing" aufgeklärt. Seit echt toll hier 👍 👍 👍


Anmelden zum Antworten