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 dann1>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 lautererror 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
-
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".