Mehrdeutiger Funktionsaufruf



  • Wieso ist dieser Code inkorrekt? Der Compiler beschwert sich, dass der Funktionsaufruf mehrdeutig ist, aber int -> long sollte doch gegenüber int -> unsigned long bevorzugt werden, nicht? Macht für mich keinen Sinn.

    void f(unsigned long x){}
    void f(signed long x){}
    int main()
    {
        f(-1);
    }
    

  • Mod

    hans mitdem langen schwan schrieb:

    aber int -> long sollte doch gegenüber int -> unsigned long bevorzugt werden, nicht?

    Eben nicht. int kann direkt in signed long umgewandelt werden und int kann direkt in unsigned long umgewandelt werden. Beide Möglichkeiten sind also um genau eine Konvertierung vom Originaltypen verschieden und somit gleichwertig. Es gibt kein "die eine Möglichkeit ist aber noch ein bisschen ähnlicher als die andere".

    Macht für mich keinen Sinn.

    Das spielt aber keine Rolle.



  • Der Unterschied ist, dass signed long alle Werte von int repräsentieren kann, unsigned long hingegen nicht. Non-narrowing Konvertierungen sollten narrowing Konvertierungen vorgezogen werden IMO. Fändest du das nicht logischer, wenns so wär?


  • Mod

    Es ist völlig egal, was da irgendjemand drüber denkt, wichtig ist nur, wie es ist.



  • Ich habe dich explizit nach deiner Meinung gefragt, ergo war es mir in diesem Moment sehr wohl wichtig, was da irgendjemand drüber denkt.
    Nur weil sich das niemals ändern wird, sollen wir nicht drüber diskutieren können oder sollen, welche Lösung die logischere ist? Ich habe meine Position geäussert und auch ein stützendes Argument dafür geliefert; das mit dem Narrowing. Und nun interessiert es mich, ob du dieses Argument auch überzeugend findest oder, wenn nicht, was dagegen spricht.


  • Mod

    Es interessiert mich aber nicht, mit dir eine fruchtlose Diskussion darüber zu führen.



  • Hans, nimm einen größeren Typ, beispielsweise signed long, und überprüfe in einer Funktion ob negativ oder nicht und mach dann *dies*.



  • Du bist nicht der erste, der sich darüber wundert.

    Habe gerade ein bisschen rumgesucht und N3387 gefunden:
    http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2012/n3387.html

    Kann man irgendwo rausfinden, wie der Status dieses Papers ist?


Log in to reply