Warum kompiliert dieser Konstruktor-Call?



  • Ich finde es etwas seltsam, dass dieser Code kompiliert (VS 2015):

    #include <iostream>
    
    struct S { 
        int i; 
        S(int i) : i(i) {} 
    };
    
    int main() {
        S s(0);
        s.S::S(1);
        std::cout << s.i << "\n"; // Output: 1
    }
    

    Mit GCC gibt es dagegen folgende Fehlermeldung: error: cannot call constructor ‘S::S’ directly
    Und mit CLang folgende: error: cannot refer to type member 'S' in 'S' with '.'

    Ist das ein Fehler von VS?

    Oder eine Art Erweiterung? Wenn ja, welchen Zweck soll ein Konstrukt wie dieses erfüllen bzw. welche Vorteile gegenüber einer einfachen Zuweisung bringen?



  • Da Konstruktoren keinen Namen haben, können sie auch nicht explizit aufgerufen werden. Darfst gerne einen Bugreport an MS schicken. (Aber nebenbei auch mal einen Blick in einen Kalender werfen ... VS 2019 steht in den Startlöchern und Preview ist schon draußen.)



  • Ok, das scheint ziemlich kaputt zu sein, es kompiliert und läuft sogar folgender Code in VS durch:

    #include <iostream>
    
    struct S { 
        int i; 
        S(int i) : i(i) {} 
        void foo(int j) const { this->S::S(j); }
    };
    
    int main() {
        S s(0);
        s.foo(1); // const call
        std::cout << s.i << "\n"; // Output: 1
    }
    

    Man kann damit also sogar const-correctness aushebeln...



  • Ja, cl kompiliert etwas, was in der Sprache nicht vorgesehen ist. Was willst jetzt tun? Weiter drauf rumreiten? Schreib einen Bugreport und gut is'.


Anmelden zum Antworten