constructor delegation



  • Hey,

    folgendes minimalbsp. compiliert nicht:

    struct foo
    {
          foo( unsigned char a ) {}
          foo( long a ) : foo(unsigned char(a)) {}
    
    //  mit C-cast funktioniert es:
    //    foo( long a ) : foo((unsigned char)(a)) {}
    };
    
    int main()
    {}
    

    g++ sagt:

    In constructor ‘foo::foo(long int)’:
    error: expected primary-expression before ‘unsigned’
     foo( long a ) : foo(unsigned char(a)) {}
                         ^~~~~~~~
    

    Hat zwar nichts zu sagen, aber:

    • MSVC sagt OK.
    • Im Standard habe ich nix dazu gefunden (12.6.2.6).

    Bug im g++?

    bb



  • @unskilled

    Bug im g++?

    Spontan: ja. Beide Schreibweisen machen das Gleiche. Funktioniert es mit char (ohne unsigned)?

    Ein long in ein char zu pressen ist allerdings auch mutig ...



  • @manni66 sagte in constructor delegation:

    Spontan: ja. Beide Schreibweisen machen das Gleiche. Funktioniert es mit char (ohne unsigned)?

    Wenn der Typ nur 1 Wort lang ist, klappt es immer. sobald ein signed/unsigned davor steht nicht mehr.

    @manni66 sagte in constructor delegation:

    Ein long in ein char zu pressen ist allerdings auch mutig ...

    Danke für deinen Hinweis

    bb



  • Kein Bug. Ein Function-Style-Cast funktioniert mehr oder weniger nur mit Typen, die als 1 Wort geschrieben werden können. Insbesondere also nicht unsigned char. Kann man im Standard unter 8.2.3 (C++17 Draft) oder bei https://en.cppreference.com/w/cpp/language/explicit_cast nachlesen.


Log in to reply