decltype mit template-member variable



  • BTW: Die non-Standard "non-const Lvalue-Referenzen an Rvalues binden" "Extension" hat MSVC übrigens immer noch:

    std::string make_string() { return "foo"; }
    void mutate_string(std::string& str) { str = "bar"; }
    
    int main()
    {
    	mutate_string(make_string());
    }
    

    Build: 1 succeeded, 0 failed, 0 up-to-date, 0 skipped

    Lässt sich (wie auch schon relativ lange) durch den Switch /Za abschalten. Damit bekommt man dann

    1>filename.cpp(123): error C2664: 'void mutate_string(std::string &)' : cannot convert argument 1 from 'std::string' to 'std::string &'
    1>          A non-const reference may only be bound to an lvalue
    

    Nur dann kann man windows.h nimmer includen, weil es lauter error C2467: illegal declaration of anonymous 'struct' und 'Identifier' : unknown size Fehler hagelt. 👎
    Mir ist schon klar dass diese Nonstandard-Sachen aus den Windows-Headers nicht so einfach zu entfernen sind, weil da Dinge dabei sind wo der verwendende Code umgeschrieben werden müsste wenn man sie standardkonform macht.
    Aber man könnte statt dessen ja das machen was das das MinGW Team gemacht hat: die Extensions lokal für die paar Stellen wo sie benötige werden erlauben, unabhängig vom /Za Switch.



  • hustbaer schrieb:

    @happystudent
    Ich glaube du hast einfach die Fehlermeldungen von Zeile 1 und 2 vertauscht. Ich bekomme mit MSVC 2013 folgendes:

    Ups, habs grade ausprobiert und du hast recht. Das ist natürlich peinlich 🙄

    Dann nehme ich alles zurück was die Fehlermeldungen angeht 🤡


  • Mod

    BTW: Die non-Standard "non-const Lvalue-Referenzen an Rvalues binden" "Extension" hat MSVC übrigens immer noch:

    Ist das nicht eine enorme Fehlerquelle? Ich meine, wenn ich eine non-const lvalue-Referenz als Parameter deklariere, erwarte ich eine Referenz auf ein Objekt das eine größere Lebenszeit hat als nur den Funktionsrumpf. Bei Const-Referenzen ist die mentality anders.

    Ich glaube du hast einfach die Fehlermeldungen von Zeile 1 und 2 vertauscht.

    Das erklärt alles. 👍



  • Arcoth schrieb:

    BTW: Die non-Standard "non-const Lvalue-Referenzen an Rvalues binden" "Extension" hat MSVC übrigens immer noch:

    Ist das nicht eine enorme Fehlerquelle? Ich meine, wenn ich eine non-const lvalue-Referenz als Parameter deklariere, erwarte ich eine Referenz auf ein Objekt das eine größere Lebenszeit hat als nur den Funktionsrumpf. Bei Const-Referenzen ist die mentality anders.

    Jain. So schlimm ist es dann doch nicht. Vor C++11 war es durchaus auch mal nützlich.
    Oder fällt dir auf die Schnelle ein Beispiel ein wo man sich damit wirklich unabsichtlich ins Knie schiessen kann?

    MS schleppt das halt schon seit Ewigkeiten mit rum, und da es dadurch vermutlich viel Code gibt der ohne die Extension nicht baut, traun sie sich da nicht drüber.

    Wobei es ja genügend andere Möglichkeiten gäbe. z.B. könnte man für diese Extension einen eigenen Switch machen, dass man die einzeln aus oder einschalten kann.

    Und wie erwähnt - ein SDK mit Header Files die sich auch bei ausgeschaltenen Extensions includen lassen wäre auch mal fein.



  • Zudem gibts bei Level 4 eine entsprechende Compilerwarnung. Wenn es einem wichtig ist, passiert das also nicht "aus Versehen".


Anmelden zum Antworten