Forum: PC-Programmierung Erste Pläne für C++20 veröffentlicht


von cpp (Gast)


Lesenswert?


von Da D. (dieter)


Lesenswert?

Die sollen mal aufhören alle paar Jahre die Sprache komplett 
umzukrempeln. Wer soll denn da hinterher kommen, den Kram zu lernen... 
;-)

von nicht"Gast" (Gast)


Lesenswert?

Was heißt hier komplett umkrempeln. Es ist schön das C++ sich nach all 
den Jahren wieder ein wenig bewegt.

Viele Sachen waren einfach nicht mehr Zeitgemäß. Kein Wunder, der 
Standard von 1989 war ja ewig Stand der Dinge. So wichtige Sachen wie 
Threads, Lambdas etc. gehören einfach in eine moderne Sprache.

von Dussel (Gast)


Lesenswert?

Ich freue mich erstmal auf C++17. Ich denke, dahin werde ich dann mein 
Wissen mal erweitern. Ich stehe ehrlich gesagt noch auf C++98…
Wie lange dauert es eigentlich, bis Compiler neue Standards 
unterstützen? Ab wann ist zum Beispiel damit zu rechnen, dass g++ oder 
Clang C++17 unterstützen? Oder tun sie das schon?

von Carl D. (jcw2)


Lesenswert?

nicht"Gast" schrieb:
> Was heißt hier komplett umkrempeln. Es ist schön das C++ sich nach all
> den Jahren wieder ein wenig bewegt.
>
> Viele Sachen waren einfach nicht mehr Zeitgemäß. Kein Wunder, der
> Standard von 1989 war ja ewig Stand der Dinge. So wichtige Sachen wie
> Threads, Lambdas etc. gehören einfach in eine moderne Sprache.

Huhu, wir haben 2017!
Und C++17, was soll sich nach all den Tagen dringend ändern?

von Flip (Gast)


Lesenswert?


von Kaj G. (Firma: RUB) (bloody)


Lesenswert?

Dussel schrieb:
> Ab wann ist zum Beispiel damit zu rechnen, dass g++ oder
> Clang C++17 unterstützen? Oder tun sie das schon?
Klar, schon lange.

Beitrag #5080576 wurde vom Autor gelöscht.
von Dussel (Gast)


Lesenswert?

Danke. Ich dachte, das würde einige Zeit dauern.

von Mod (Gast)


Lesenswert?

Hi, die sollten lieber mal veraltete Dinge über Bord werfen, um den 
Sprachumfang, und somit nicht zuletzt die Komplexität etwas in Zaun zu 
Halten.
Gruß

von opravo (Gast)


Lesenswert?

Mod schrieb:
> Hi, die sollten lieber mal veraltete Dinge über Bord werfen, um
> den
> Sprachumfang, und somit nicht zuletzt die Komplexität etwas in Zaun zu
> Halten.
> Gruß

C++ aktualisieren ohne Abwärtskompatibilität? Dann kann man es sich auch 
gleich sparen, da steigt keiner um.
Es zwingt einen ja keiner die "veralteten Dinge" zu verwenden, oder?

von Yalu X. (yalu) (Moderator)


Lesenswert?

Da D. schrieb:
> Die sollen mal aufhören alle paar Jahre die Sprache komplett
> umzukrempeln. Wer soll denn da hinterher kommen, den Kram zu lernen...
> ;-)

Die Weiterentwicklung von C++ geschieht ja noch relativ langsam. Schau
dir mal an, mit welcher Frequenz neue C#-Versionen hinausgeballert
werden :)

Mod schrieb:
> Hi, die sollten lieber mal veraltete Dinge über Bord werfen, um den
> Sprachumfang, und somit nicht zuletzt die Komplexität etwas in Zaun zu
> Halten.

Mal angenommen, Abwärtskompatibilität wäre kein Kriterium: Welche alten
Features sollte man deiner Ansicht weglassen, so dass

1. der Sprache keine wesentliche Funktionalität genommen wird und

2. tatsächlich eine deutliche Verschlankung der Sprache erreicht wird?

So arg viel gibt es da nicht.

Ich mag C++ auch nicht besonders, aber es ist eine der ganz wenigen
Sprachen, in der man einserseits so maschinennah und performant wie in C
programmieren kann, auf der anderen Seite aber auch eine ganze Menge
High-Level-Features geboten bekommt. Das macht es für mich trotz vieler
Holprigkeiten interessant.

Die seit C++11 neu eingeführten Sprachelemente betreffen vor allem die
High-Level-Programmierung und die Reduktion der stellenweise durch die
Verwendung von High-Level-Features bedingten Performanceverluste. Das
stellt IMHO einen deutlichen Fortschritt dar und macht für mich C++
zunehmend attraktiv.

Leider sind meine C++-Kenntnisse recht bruchstückhaft, und die neuen
Features wollen z.T. richtig gelernt werden (in Python fällt es mir
bspw. viel leichter, Schritt mit der aktuellen Entwicklung zu halten).
Mein letztes C++-Buch ist von 1998, darüber hinausgehendes Wissen habe
ich stückweise (und damit unvollständig) aus dem Internet erlangt.

Deswegen werde ich meine Vorbehalte etwas zurückstellen und mir
demnächst nach einem guten Lehrbuch umsehen und dieses systematisch
durcharbeiten. Selbst wenn mir dann C++ immer nocht nicht gefällt, kann
ich wenigstens fundiert darüber meckern ;-)

von Timm R. (Firma: privatfrickler.de) (treinisch)


Lesenswert?

Hallo,

Mod schrieb:
> Hi, die sollten lieber mal veraltete Dinge über Bord werfen, um
> den
> Sprachumfang, und somit nicht zuletzt die Komplexität etwas in Zaun zu
> Halten.

das ist so ein Barnum-Satz wie in Horoskopen. Kann man auf einen 
Großteil aller Änderungen / Neuerungen antworten.

Was konkret wären denn solche veralteten Dinge, die über Bord gehören?

Ich arbeite mich seit kurzem in C++14 ein (früher viel mit c++98 
gemacht) und bin bisher extremst begeistert und habe bisher eigentlich 
den Eindruck, dass der Großteil recht übersichtlich, im Sinne von 
logisch konsistent, ist.

Vor allem nach aktuell wirklich frustrierenden Erfahrungen mit den 
dauernden alles umstürzenden Swift Releases.

vlg

 Timm


Edit: Ja gut, man könnte zum Beispiel argumentieren, dass std::bind weg 
kann.

Ich denke aber, man müsste da schon zwischen Sprachfeatures im engeren 
Sinne und unter Benutzung der Sprachfeatures zur Verfügung gestellten 
Funktionen in der Standardbibliothek unterscheiden.

Abgesehen davon schafft das Beibehalten von std::bind keine Komplexität. 
Wenn ich es nicht benutzen will, muss ich mich 0.00 damit beschäftigen, 
es entgeht einem absolut gar nichts, weil die c++14 Lambdas ein 
vollwertiger Ersatz sind. Das einzige Ergebnis wäre, dass alter Code 
nicht mehr funktionieren würde.

Anders sieht es mit der type deduction aus, die ist so allgegenwärtig, 
dass man sich damit beschäftigen muss, ob man will oder nicht. Die 
schafft etwas Komplexität, ist aber keine Altlast.

Also: Wo ist die Altlast, die Komplexität schafft?

: Bearbeitet durch User
von Wilhelm M. (wimalopaan)


Lesenswert?

Timm R. schrieb:

> ...
> Ich denke aber, man müsste da schon zwischen Sprachfeatures im engeren
> Sinne und unter Benutzung der Sprachfeatures zur Verfügung gestellten
> Funktionen in der Standardbibliothek unterscheiden.
>
> Abgesehen davon schafft das Beibehalten von std::bind keine Komplexität.
> Wenn ich es nicht benutzen will, muss ich mich 0.00 damit beschäftigen,
> es entgeht einem absolut gar nichts, weil die c++14 Lambdas ein
> vollwertiger Ersatz sind. Das einzige Ergebnis wäre, dass alter Code
> nicht mehr funktionieren würde.
>
> Anders sieht es mit der type deduction aus, die ist so allgegenwärtig,
> dass man sich damit beschäftigen muss, ob man will oder nicht. Die
> schafft etwas Komplexität, ist aber keine Altlast.
>
> Also: Wo ist die Altlast, die Komplexität schafft?

Da C++17, ff. immer noch abwärtskompatibel sind, muss(!) man sich mit 
type-deduction nicht beschäftigen.

Setzt man aber type-deduction richtig ein, wird der Code leichter 
verständlich. Und das ist ein wesentliches Feature. Vor allem bei 
automatischer Typinferenz von class-template Parametern.

Dasselbe gilt für concepts/constraints (mein persönliches highlight 
zusammen mit modules). Wobei concepts/constraints wirklich Möglichkeiten 
schaffen, die es in der Form vorher nicht gab (man kann nicht alles mit 
SFINAE erschlagen). Hier also ein Feature, das neue Möglichkeiten 
schafft (zusammen mit constexpr-if) und gleichzeitig Altlasten / Hacks 
wie SFINAE entsorgt.

von lalala (Gast)


Lesenswert?

Kaj G. schrieb:
> Dussel schrieb:
>> Ab wann ist zum Beispiel damit zu rechnen, dass g++ oder
>> Clang C++17 unterstützen? Oder tun sie das schon?
> Klar, schon lange.

Laut dieser Seite: http://en.cppreference.com/w/cpp/compiler_support
unterstützen sie C++17 zu 99%. P0067R5 scheint noch zu fehlen.

von ui (Gast)


Lesenswert?

Mir fallen schon ein paar Dinge ein, die man weglassen kann. Was mich an 
C++ am meisten stört (und es wird ja auch so kommuniziert): Es wird 
immer gesagt, dieses und jenes könne man in C++ besser lösen 
(einfachstes Beispiel: ptr vs. smart_ptr). Nur richtig umgesetzt wirds 
nicht. Es ist zwar vorhanden (smart_ptr) aber der Programmierer wird 
nicht dazu gezwungen. Und das ist für mich ein gewaltiger Nachteil. Und 
es gibt viele Dinge wo es so umgesetzt wird.

Das ist ein gewisser Grad von Inkonsistenz. Jeder weiß, dass C gewisse 
Nachteile hat. Diese Nachteile will man mit C++ abfangen bzw. 
verbessern. Aber um die Abwärtskompatibilität unbedingt aufrecht zu 
erhalten zieht man es doch nicht richtig durch. Das heißt für mich, man 
kombiniert die negativen Eigenschaften von C mit neuen negativen 
Eigenschaften (z.B. Ellenlange Definitionen).Warum nicht
1
uint8_t *ptr
per default zu einem smart_ptr machen? Was spricht denn dagegen?
Die Macher von C++ müssen sich IMHO entscheiden was sie wollen: Entweder 
eine moderne, typsichere Sprache die C# und Java Konkurrenz machen kann, 
oder sie bleibt halt immer C mit Erweiterung.

Ein ähnlicher harter Schritt wie in python würde dem Standard denke ich 
gut tun.

von Timm R. (Firma: privatfrickler.de) (treinisch)


Lesenswert?

Hallo Wilhelm,

Wilhelm M. schrieb:

> Da C++17, ff. immer noch abwärtskompatibel sind, muss(!) man sich mit
> type-deduction nicht beschäftigen.

Klar. Man muss sich nicht damit beschäftigen. Was ich meinte ist, dass 
einem wesentliches entgeht, wenn an es nicht tut. Anders als (soweit ich 
erkennen kann), wenn man sich nicht mit std::bind beschäftigt. Da 
entgeht einem praktisch gar nichts.

imho.


vlg

 Timm

Edit: Vielen Dank übrigens für die extrem interessanten Stichworte!

: Bearbeitet durch User
von Wilhelm M. (wimalopaan)


Lesenswert?

ui schrieb:
> Mir fallen schon ein paar Dinge ein, die man weglassen kann. Was mich an
> C++ am meisten stört (und es wird ja auch so kommuniziert): Es wird
> immer gesagt, dieses und jenes könne man in C++ besser lösen
> (einfachstes Beispiel: ptr vs. smart_ptr). Nur richtig umgesetzt wirds
> nicht. Es ist zwar vorhanden (smart_ptr) aber der Programmierer wird
> nicht dazu gezwungen. Und das ist für mich ein gewaltiger Nachteil. Und
> es gibt viele Dinge wo es so umgesetzt wird.

Das ist Aufgabe desjenigen, der er Interface schreibt. Und da es noch 
reine C-Bibliotheken und auch alte C++ Bibliotheken gibt, wird das so 
bleiben.

Im Übrigen ist daran auch wenig Schlimmes. Man muss sich eben nur über 
die unterschiedlichen Zeigertypen und ihre Semantik im klaren sein. Es 
gibt eben Zeiger mit Eigentümerschaft und solche ohne (reine 
Benutzungsrelation).

> Das ist ein gewisser Grad von Inkonsistenz. Jeder weiß, dass C gewisse
> Nachteile hat. Diese Nachteile will man mit C++ abfangen bzw.
> verbessern. Aber um die Abwärtskompatibilität unbedingt aufrecht zu
> erhalten zieht man es doch nicht richtig durch. Das heißt für mich, man
> kombiniert die negativen Eigenschaften von C mit neuen negativen
> Eigenschaften (z.B. Ellenlange Definitionen).

Sehe ich nicht.

> Warum nicht
>
1
> uint8_t *ptr
2
>
> per default zu einem smart_ptr machen?

Weil das nicht sinnvoll ist (s.o.).

von Timm R. (Firma: privatfrickler.de) (treinisch)


Lesenswert?

Hallo,

ehrlich gesagt frage ich mich, ob Du nicht eventuell „keinen Durchblick 
haben" mit Komplexität verwechselst?

Dein Ansatz Implentierungsentscheidungen des Entwicklers durch 
Eingleisigkeit der Sprachumgebung zu ersetzen ist, soweit ich das 
erkennen kann, ziemlich genau das Gegenteil der Philosophie von C++.

ui schrieb:
Warum nicht
>
1
> uint8_t *ptr
2
>
> per default zu einem smart_ptr machen? Was spricht denn dagegen?

Na dann mal Butter bei die Fische, wie das hier bei uns heißt, welcher 
Smart Pointer solls denn sein? Dann wirst Du auch sehen warum das eine 
schlechte Idee ist.

smart_ptr gibt es nicht.

vlg

Timm

von Yalu X. (yalu) (Moderator)


Lesenswert?

ui schrieb:
> Warum nicht
> uint8_t *ptr
> per default zu einem smart_ptr machen?

Die verschiedenen Typen von Smart Pointern in C++ sind nur sinnvoll und
überhaupt verwendbar in Verbindung mit dynamisch allozierten Objekten.
Solange nicht alle Objekte in einem Programm dynamisch alloziert werden,
braucht man auch klassische Pointer bzw. Referenzen.

: Bearbeitet durch Moderator
von Wilhelm M. (wimalopaan)


Lesenswert?

Yalu X. schrieb:

> Die verschiedenen Typen von Smart Pointern in C++ sind nur sinnvoll und
> überhaupt verwendbar in Verbindung mit dynamisch allozierten Objekten.
> Solange nicht alle Objekte in einem Programm dynamisch alloziert werden,
> braucht man auch klassische Pointer bzw. Referenzen.

Nein (also: ... nicht alle ...): wenn mindestens ein Objekt dynamisch 
allokiert wird (und dies sollte man in MCPP mit std::make_shared<>() 
bzw. std::make_unique<>() machen), verwendet man Intelligente Zeiger.

von Yalu X. (yalu) (Moderator)


Lesenswert?

Wilhelm M. schrieb:
> Nein (also: ... nicht alle ...): wenn mindestens ein Objekt dynamisch
> allokiert wird (und dies sollte man in MCPP mit std::make_shared<>()
> bzw. std::make_unique<>() machen), verwendet man Intelligente Zeiger.

Ja, aber eben nur für die dynamischen Objekte. Ein shared_ptr oder
unique_ptr auf andere Variablen führt i.Allg. zu einem fehlerhaften
Verhalten zur Laufzeit. Wenn man einen Pointer auf eine dieser anderen
Variablen zeigen lassen möchte, kommt man um einen klassischen Pointer
(oder alternativ eine Referenz) nicht herum.

von Torsten R. (Firma: Torrox.de) (torstenrobitzki)


Lesenswert?

ui schrieb:
> Warum nicht
>
1
> uint8_t *ptr
2
>
> per default zu einem smart_ptr machen? Was spricht denn dagegen?

1) ist `std::uint8_t *ptr` einfach eine Referenz auf ein std::uint8_t. 
Smart Pointer verwendet man aber nur da, wo es um die Verwaltung von 
dynamischen Speicher und dessen Besitz geht.
2) Welchen smart pointer möchtest Du den haben? shared_ptr<> wäre wohl 
in den meisten Fällen nicht falsch. unique_ptr<> aber wohl in den 
allermeisten Fällen richtig (Vorraussetzung).

Wenn Du in C++ einfach blind jeden Zeiger durch einen smart pointer 
ersetzt, dann wirst Du sehr wahrscheinlich jede Menge Fehler in Deine 
Applikation bauen. Vorallem, wenn man denkt, sich dann keine Gedanken 
mehr um Design machen zu müssen. Die meisten Probleme mit 
Memory-Problemen, die ich bis jetzt gesehen haben, waren in Java und C# 
Applikationen, weil die Kollegen erst am Ende der Entwicklung gemerkt 
haben, dass Garbage-Collection halt nicht alles heil macht.

> Die Macher von C++ müssen sich IMHO entscheiden was sie wollen: Entweder
> eine moderne, typsichere Sprache die C# und Java Konkurrenz machen kann,
> oder sie bleibt halt immer C mit Erweiterung.

Worin glaubst Du, sind die VMs von C# und Java geschrieben?

von Timm R. (Firma: privatfrickler.de) (treinisch)


Lesenswert?

Hallo,

Yalu X. schrieb:
> Ja, aber eben nur für die dynamischen Objekte. Ein shared_ptr oder
> unique_ptr auf andere Variablen führt i.Allg. zu einem fehlerhaften
> Verhalten zur Laufzeit. Wenn man einen Pointer auf eine dieser anderen
> Variablen zeigen lassen möchte, kommt man um einen klassischen Pointer
> (oder alternativ eine Referenz) nicht herum.

warum gibt das denn eine Abwertung? Auf einen einfachen Datentyp wie zB 
float, als normale Variable kann man doch keinen Smart Pointer setzen? 
Stimmt doch? Will man auch gar nicht, aber das ist eine andere Frage.


Ich habe noch zwei Fragen / Anmerkungen.

1)
Ein shared_ptr und ein unique_ptr haben doch einen memory overhead? Das 
könnte doch unter Umständen auch ein Grund für einen raw pointer sein?

2)
Bei einer cyclischen Referenz wie dieser (oder so ähnlich):
1
class X
2
{
3
public:
4
    std::shared_ptr<X> sibling;
5
}
6
7
int main()
8
{
9
    std::shared_ptr a = make_shared<X>();
10
    std::shared_ptr b = make_shared<X>();
11
    a->sibling = b;
12
    b->sibling = a;
13
}

ist doch mit shared_ptr Schicht im Schacht, während es sich in diesem 
Fall mit raw Pointern, auch wenn X einen speziellen dtor hätte, einfach 
in Wohlgefallen auflösen würde?

Jeder Pointer hat halt so seine Funktionalität und danach muss man sie 
eben auswählen, auch der raw-Pointer?


Zurück zum ursprünglichen Thema: Der auto_ptr ist doch mittlerweile tot, 
oder? Das wäre doch ein Beispiel für eine beerdigte Altlast?

vlg
 Timm

von Wilhelm M. (wimalopaan)


Lesenswert?

Timm R. schrieb:

> 1)
> Ein shared_ptr und ein unique_ptr haben doch einen memory overhead? Das
> könnte doch unter Umständen auch ein Grund für einen raw pointer sein?

Eigentlich hat nur der std::shared_ptr<>() einen memory-overhead. 
(Solange beim std::unique_ptr<> kein spezieller deleter eingesetzt 
wird).

Der Indirektionsnachteil sollte bei beiden null sein.

>
> 2)
> Bei einer cyclischen Referenz wie dieser (oder so ähnlich):
...
> ist doch mit shared_ptr Schicht im Schacht, während es sich in diesem
> Fall mit raw Pointern, auch wenn X einen speziellen dtor hätte, einfach
> in Wohlgefallen auflösen würde?

Dafür haben wir std::weak_ptr.

> Jeder Pointer hat halt so seine Funktionalität und danach muss man sie
> eben auswählen, auch der raw-Pointer?

Ja, wie schon (so oft) geschrieben: non-owning-pointer bzw. Zeiger, die 
nur
eine Benutzungsrelation ausdrücken.

>
> Zurück zum ursprünglichen Thema: Der auto_ptr ist doch mittlerweile tot,
> oder? Das wäre doch ein Beispiel für eine beerdigte Altlast?

Ja, wobei er von Anfang an tot war und deswegen so gut wie nie verwendet 
wurde (ist ein Spezialfall mit Verschiebungssemantik).

: Bearbeitet durch User
von Pragmatiker (Gast)


Lesenswert?

cpp schrieb:
> Programmiersprachen: Erste Pläne für C++20 veröffentlicht
> 
https://www.heise.de/developer/meldung/Programmiersprachen-Erste-Plaene-fuer-C-20-veroeffentlicht-3772568.html

Das einzige was man muss, ist das #pragma/compilerschalter um den Code 
genauso wie bewährt schreiben und übersetzen zu können.

von interrupt (Gast)


Lesenswert?

Yalu X. schrieb:
> Deswegen werde ich meine Vorbehalte etwas zurückstellen und mir
> demnächst nach einem guten Lehrbuch umsehen und dieses systematisch
> durcharbeiten.

Was für ein Buch wäre für C++17 denn zu empfehlen ?

von Wilhelm M. (wimalopaan)


Lesenswert?

interrupt schrieb:
> Yalu X. schrieb:
>> Deswegen werde ich meine Vorbehalte etwas zurückstellen und mir
>> demnächst nach einem guten Lehrbuch umsehen und dieses systematisch
>> durcharbeiten.
>
> Was für ein Buch wäre für C++17 denn zu empfehlen ?

Derzeit gibt es eigentlich nur Bücher zu c++11/14. Aber das reicht 
eigentlich auch, die wesentlichen Dingen sind schon im Übergang 
c++98->c++11 gewesen. Den Rest kann man sich eigentlich aus

http://en.cppreference.com/w/

erlesen und den einschlägigen Blogs wie

https://isocpp.org/blog

oder C++Weekly von Jason, bzw. auch den guten Beiträgen von

https://herbsutter.com/

http://foonathan.net/

https://akrzemi1.wordpress.com/

http://www.fluentcpp.com/

u.dgl.m.

Wobei die Themen concepts/constraints (nur im gcc) und modules (nur im 
clang) naturgemäß schwer zu finden sind.

von Nop (Gast)


Lesenswert?

ui schrieb:

> Warum nicht uint8_t *ptr
> per default zu einem smart_ptr machen?

Wäre das nicht problematisch an Stellen, wo man Pointer nutzt, ohne in 
irgendeiner Weise (auch nicht indirekt) malloc/free zu verwenden? Vor 
allem in bestehendem Code, den man nicht extra umschreiben will?

von Wilhelm M. (wimalopaan)


Lesenswert?

Nop schrieb:
> ui schrieb:
>
>> Warum nicht uint8_t *ptr
>> per default zu einem smart_ptr machen?
>
> Wäre das nicht problematisch an Stellen, wo man Pointer nutzt, ohne in
> irgendeiner Weise (auch nicht indirekt) malloc/free zu verwenden?

Selbstverständlich!!! Das darf nicht sein! Aber das ist auch alles schon 
oben geschrieben worden.

Nochmal: es gibt Zeiger mit Eigentümerschaft (typischerweise als 
SmartPointer bezeichnet) wie std::unique_ptr<> und std::shared_ptr<> und 
solche ohne Eigentümerschaft wie std::observer_ptr<> oder 
std::weak_ptr<> und natürlich auch Rohe Zeiger. Und natürlich darf man 
Zeiger mit Eigentümerschaft auch nur dort einsetzen, wo man ein Objekt 
erzeugt hat, dessen Lebensdauer nicht-automatisch geregelt wird, also 
typischerweise Objekte auf der Halde. Und damit man dabei so wenig 
Fehler wie möglich machen kann, ist in MCPP die Erzeugung von Objekten 
mit dyn. storage durch die Hilfsfunktionstemplates std::make_unique<> 
und std::make_shared<> bevorzugt (nie mehr ein explizites new/delete). 
Damit wäre dann auch obiges Konstrukt ersetzt durch einen SmartPointer 
zwar nicht unmöglich, jedoch sofort durch statische Code-Analyse 
aufzudecken.

Die rohen Zeiger bleiben damit für die Modellierung einer reinen 
Benutzungsrelation ohne Eigentümerschaft. Dies können auch Zeiger auf 
statische oder lokale Objekte sein. Im allg. sollte man Referenzen 
vorziehen, wenn man kann, und rohe Zeiger benutzen, wenn man muss, bspw. 
wenn man auch ausdrücken können muss, dass man kein Objekt referenziert 
(nullptr).

von interrupt (Gast)


Lesenswert?

Wilhelm M. schrieb:
> Derzeit gibt es eigentlich nur Bücher zu c++11/14.

Und welches wäre da zu empfehlen ?

von Wilhelm M. (wimalopaan)


Lesenswert?

interrupt schrieb:
> Wilhelm M. schrieb:
>> Derzeit gibt es eigentlich nur Bücher zu c++11/14.
>
> Und welches wäre da zu empfehlen ?

m.E.

Breymann; "Der C++Programmierer", neue Auflage!

Grimm, "C++11"

Meyers, "Effective modern C++"

Josuttis, "The C++ Standard Library"

Bancila, "Modern C++ Programming Cookbook"

von Timm R. (Firma: privatfrickler.de) (treinisch)


Lesenswert?

Hallo,

Wilhelm M. schrieb:

> oder C++Weekly von Jason, bzw. auch den guten Beiträgen von
>
> https://herbsutter.com/
>
> http://foonathan.net/
>
> https://akrzemi1.wordpress.com/
>
> http://www.fluentcpp.com/

Hammer! Wer noch nicht reingeschaut hat und 98er ist, wie ich, sollte 
unbedingt mal reinstöbern. Fluentcpp zum Beispiel schreibt wirklich 
locker und auch didaktisch sehr sehr gut.

Danke!

Vlg
 Timm

von Wilhelm M. (wimalopaan)


Lesenswert?

Timm R. schrieb:
> Hallo,
>
> Wilhelm M. schrieb:
>
>> oder C++Weekly von Jason, bzw. auch den guten Beiträgen von
>>
>> https://herbsutter.com/
>>
>> http://foonathan.net/
>>
>> https://akrzemi1.wordpress.com/
>>
>> http://www.fluentcpp.com/
>
> Hammer! Wer noch nicht reingeschaut hat und 98er ist, wie ich, sollte
> unbedingt mal reinstöbern. Fluentcpp zum Beispiel schreibt wirklich
> locker und auch didaktisch sehr sehr gut.
>
> Danke!
>
> Vlg
>  Timm

Hatte vergessen

https://isocpp.github.io/CppCoreGuidelines/CppCoreGuidelines

explizit zu erwähnen (oh, ich höre schon den Aufschrei: eine Sprache, 
die so
etwas braucht, ist nicht zu gebrauchen ...)

Ich finde diese Guidelines und die GSL aus zwei Aspekten interessant:

1) Wie die C++-SuperFAQ ein gut strukturiertes Nachschlagewerk, das 
speziell auf MCPP ausgerichtet ist (beantwortet damit auch die Frage 
nach den Altlasten (s.o.).

2) Es sind schon viele Hinweise auf die künftigen Änderungen / Planungen 
eingebaut (z.B. uniform-function-call Syntax und Concepts / 
Constraints).

von Yalu X. (yalu) (Moderator)


Lesenswert?

Wilhelm M. schrieb:
> 1) Wie die C++-SuperFAQ ein gut strukturiertes Nachschlagewerk, das
> speziell auf MCPP ausgerichtet ist (beantwortet damit auch die Frage
> nach den Altlasten (s.o.).

Du benutzt immer wieder den Begriff MCPP, von dem ich noch nie gehört
habe. Eine Web-Suche liefert im Wesentlichen drei Bedeutungen:

Eine psychoaktive Substanz:

  https://en.wikipedia.org/wiki/Meta-Chlorophenylpiperazine

Ein C/C++-Präprozessor:

  http://mcpp.sourceforge.net/

bzw. dessen Nachfolger:

  https://github.com/zeroc-ice/mcpp

Managed C++, der Vorgänger von C++/CLI für .NET von Microsoft:

  https://www.it-visions.de/glossar/alle/600/Managed_C.aspx

Falls du keine dieser drei Bedeutungen meinst (was ich fast vermute),
welche dann? Und wo kann man mehr darüber lesen?

Edit:

Wilhelm M. schrieb:
> Breymann; "Der C++Programmierer", neue Auflage!

Gestern war ich in einem Buchladen, habe mir dieses Buch (aktuelle
Auflage von 2016) angeschaut. Einen Stroustrup (2013) zum direkten
Vergleich war leider nicht vorrätig. Da ich nicht mit leeren Händen
nach Hause gehen wollte, habe ich mich kurzerhand für den Breymann
entschieden.

Nach den ersten ca. 100 Seiten bin ich mit dem Buch trotz des leicht
unsystematischen Aufbaus und einiger kleiner Fehler ganz zufrieden.
Wenn ich durch bin, werde ich evtl. einen kleinen Erfahrungsbericht
schreiben.

: Bearbeitet durch Moderator
von Timm R. (Firma: privatfrickler.de) (treinisch)


Lesenswert?

Hallo Yalu,

naja, wohl

using MCPP = Modern CPP, also post-C++98.

vlg
 Timm

von Yalu X. (yalu) (Moderator)


Lesenswert?

Timm R. schrieb:
> using MCPP = Modern CPP, also post-C++98.

Ah, jetzt ja, vielen Dank fürs Augenöffen :)

Da muss man erst einmal draufkommen. Aber du hast natürlich recht, so
ergibt das einen Sinn.

Trotzdem scheint die Abkürzung MCPP nicht sehr gebräuchlich zu sein.
Auch dürfte der Begriff "Modern C++ Programming" einem ständigen
Bedeutungswandel unterworfen sein. Heute ist MCPP = Post-C++98, in ein
paar Jahren wird MCPP = Post-C++17 sein ;-)

von Wilhelm M. (wimalopaan)


Lesenswert?

Yalu X. schrieb:
> Timm R. schrieb:
>> using MCPP = Modern CPP, also post-C++98.
>
> Ah, jetzt ja, vielen Dank fürs Augenöffen :)

Ja, so war es gedacht.

> Da muss man erst einmal draufkommen. Aber du hast natürlich recht, so
> ergibt das einen Sinn.

Dachte, dass das "selbsterklärend" wäre. Man schreibt ja auch nicht 
immer Konstruktor oder Destruktor, sondern kürzt das oft mit ctor und 
dtor ab. Und das ist auch kein Akronym, was in Wikipedia steht ...

> Trotzdem scheint die Abkürzung MCPP nicht sehr gebräuchlich zu sein.

Wird aber mehr: das erste Mal habe ich das glaube im Vortrag von Scotty 
gesehen, weil sein letztes Buch ja auch "Effective MODERN C++" heißt.

> Auch dürfte der Begriff "Modern C++ Programming" einem ständigen
> Bedeutungswandel unterworfen sein.

Selbstverständlich, weil er ja ein moving-target ist.

> Heute ist MCPP = Post-C++98, in ein
> paar Jahren wird MCPP = Post-C++17 sein ;-)

Da wird er hoffentlich obsolet sein, denn im Moment befindet sich die 
überwiegende Mehrzahl der CPP-Programmierer in einer Situation, wo sie 
entweder selbst noch den Umstieg machen oder eben mit altem Code zu tun 
haben.

Das Kommittee will ja auch, dass die Sprache sich bewegt durch den 
3-jährigen Zyklus und durch die Arbeitsweise über die TS-Prozedur.

von Timm R. (Firma: privatfrickler.de) (treinisch)


Lesenswert?

Hallo,

Wilhelm M. schrieb:

> https://isocpp.github.io/CppCoreGuidelines/CppCoreGuidelines

na, das kommt doch einem C++14 Lehrbuch durchaus recht nahe?

Sehr cool finde ich den Abschnitt N: Non-Rules :-) Endlich mal!


Eine Sache beschäftigt mich allerdings: eine ganze Reihe von Vorschlägen 
sowohl aus diesen Guidelines, als auch in anderen Quellen, zB fluentcpp 
würden IMHO nahelegen, dass es nett wäre benannte Parameter zu haben. 
Für Compiler / Präprozessor sollte das nur eine entspannte Fingerübung 
sein, dennoch scheinen benannte Parameter (also beim Aufruf mit Namen 
versehen) absolut niemanden besonders zu bewegen?

vlg
 Timm

von mh (Gast)


Lesenswert?

Benannte Funktionsparameter in der Sprache wären sicher eine praktische 
Sache und vermutlich kein Problem für den Compiler. Aber wie könnte das 
in C++ aussehen? Die Vorschläge, die ich bis jetzt gesehen habe, hatten 
entweder offensichtliche Problme, waren unleserlich oder viel zu 
kompliziert.
Wenn du nen praktikable Lösung kennst würde mich das sehr interessieren.

von Timm R. (Firma: privatfrickler.de) (treinisch)


Lesenswert?

Hallo,

mh schrieb:
> Benannte Funktionsparameter in der Sprache wären sicher eine praktische
> Sache und vermutlich kein Problem für den Compiler. Aber wie könnte das
> in C++ aussehen? Die Vorschläge, die ich bis jetzt gesehen habe, hatten
> entweder offensichtliche Problme, waren unleserlich oder viel zu
> kompliziert.
> Wenn du nen praktikable Lösung kennst würde mich das sehr interessieren.

vielleicht gibts da ein Missverständnis. Ich meinte als syntaktische 
Neuerung. Nicht als Lösung mit bestehenden Sprachmitteln.

Die Lösungen mit bestehenden Sprachmitteln finde ich alle grauenhaft. 
Strong Types zähle ich mal nicht dazu, die finde ich schon sehr nett und 
auch logisch zusätzlich können ja auch noch sehr viel mehr, Überladungen 
auflösen zum Beispiel. Aber wenn man für jeden benannten Parameter einen 
starken Typen einführt ...

Wahrscheinlich sind andere Dinge im Moment erstmal wichtiger ...

vlg
 Timm

von mh (Gast)


Lesenswert?

Kein Missverständnis, ich hab auch von einer Erweiterung der Sprache 
gesprochen. Wie kann C++ um benannte Funktionsparameter Erweitert 
werden?

von Wilhelm M. (wimalopaan)


Lesenswert?

Timm R. schrieb:
> Hallo,
>
> Wilhelm M. schrieb:
>
>> https://isocpp.github.io/CppCoreGuidelines/CppCoreGuidelines
>
> na, das kommt doch einem C++14 Lehrbuch durchaus recht nahe?
>
> Sehr cool finde ich den Abschnitt N: Non-Rules :-) Endlich mal!
>
>
> Eine Sache beschäftigt mich allerdings: eine ganze Reihe von Vorschlägen
> sowohl aus diesen Guidelines, als auch in anderen Quellen, zB fluentcpp
> würden IMHO nahelegen, dass es nett wäre benannte Parameter zu haben.
> Für Compiler / Präprozessor sollte das nur eine entspannte Fingerübung
> sein, dennoch scheinen benannte Parameter (also beim Aufruf mit Namen
> versehen) absolut niemanden besonders zu bewegen?

Dafür gibt es Vorschläge:

http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2014/n4172.htm

Doch gibt es eben auch schon immer einige Alternativen und es sind auch 
noch einige dazu gekommen:

1) strong-types und parameter-permutation
2) named-parameter idiom

In C++20 kommen dann designated-initializers hinzu. Auf dem Weg dahin 
kann man die durch IIFE ersetzen.

Es gibt auch Möglichkeiten über Proxy-Templates zu gehen oder auch 
std::tuple einzusetzen. Aber das ist alles mit viel boilerplate 
verbunden.

In meinen Augen sind 1) und 2) absolut ausreichend und 
designated-initializers wären eine tolle Ergänzung.

Leider sehe ich in der Praxis immer noch sehr viel Code, der DIE 
wichtigste Schnittstellenregel nicht beachtet:

Eine Schnittstelle sollte leicht richtig und schwer falsch zu benutzen 
sein!

Und das erreicht man m.E. sehr gut mit 1) und / oder 2).

von Timm R. (Firma: privatfrickler.de) (treinisch)


Lesenswert?

Hallo,

ich hätte noch einen Lesetipp:

Es gibt die Präsentation von Scott Meyers
Overview of the New C++ (C++11)

Die wird aktualisiert, in der neuesten verfügbaren ist C++14 
eingearbeitet.

Kostet leider $30

Hier kann man reinschauen:

https://www.artima.com/samples/cpp11-14NotesSample.pdf


So roundabout 400 Slides, vielleicht 300 slides netto, geht ziemlich zur 
Sache, mit recht wenig Erklärung. Aber für mich das perfekte Curriculum. 
Für mich eine absolute Empfehlung, weil einfach jedes Wort sitzt und es 
wirklich um das Delta C++98 / C++14 geht.

Vlg
 Timm

von Johann L. (gjlayde) Benutzerseite


Lesenswert?

mh schrieb:
> Wie kann C++ um benannte Funktionsparameter Erweitert werden?

Wurde wohl abgelehnt.

https://gcc.gnu.org/ml/gcc/2015-03/msg00202.html

> Note that a proposal for named arguments was recently presented to
> the C++ standards committee [1], and they did not seem receptive
> to it [2].
>
> The proposal was for a different syntax (name : value), but the
> objections were not related to the syntax.

: Bearbeitet durch User
von zer0 (Gast)


Lesenswert?

ui schrieb:
> Warum nichtuint8_t *ptr
> per default zu einem smart_ptr machen? Was spricht denn dagegen?

Dass man mündigen Individuen diese Entscheidung auch selbst überlassen 
kann, die dann auch High-Level-C++ auf einem Micro-Controller mit 512 
byte RAM hinbekommen. Denn

Yalu X. schrieb:
> durch die
> Verwendung von High-Level-Features bedingten Performanceverluste

gab und gibt es in C++ einfach nicht, wenn man die Sprache unter 
Kontrolle hat. Da kann man noch ganz genau das ausdrücken, was man haben 
will. Und wenn man mal in der Situation ist, eine C++-Library, die mit 
Compiler und stdlib A kompiliert wurde, mit Compiler und stdlib B 
benutzen zu wollen, weiß man auch, warum man in den Schnittstellen 
besser nur PODs verwendet!

von zer0 (Gast)


Lesenswert?

zer0 schrieb:
> Yalu X. schrieb:
>> durch die
>> Verwendung von High-Level-Features bedingten Performanceverluste
>
> gab und gibt es in C++ einfach nicht

Nach Reflektion muss ich das nochmal einschränken. Die Compile-Time hat 
mitunter gewaltig gelitten...

von zer0 (Gast)


Lesenswert?

opravo schrieb:
> C++ aktualisieren ohne Abwärtskompatibilität?

Ist doch Gang und Gebe. Schon seit C++-11 funktionieren keine Container 
mehr, die structs mit mindestens einem const-member enthalten. Mit 
Copy-Construct ging das noch. Mit move nicht mehr.

von mh (Gast)


Lesenswert?

zer0 schrieb:
> opravo schrieb:
>> C++ aktualisieren ohne Abwärtskompatibilität?
>
> Ist doch Gang und Gebe. Schon seit C++-11 funktionieren keine Container
> mehr, die structs mit mindestens einem const-member enthalten. Mit
> Copy-Construct ging das noch. Mit move nicht mehr.

Kannst du ein minimales Beispiel geben, dass mit c++98 compiliert aber 
nicht mit c++11?

von zer0 (Gast)


Lesenswert?

mh schrieb:
> zer0 schrieb:
> opravo schrieb:
> C++ aktualisieren ohne Abwärtskompatibilität?
>
> Ist doch Gang und Gebe. Schon seit C++-11 funktionieren keine Container
> mehr, die structs mit mindestens einem const-member enthalten. Mit
> Copy-Construct ging das noch. Mit move nicht mehr.
>
> Kannst du ein minimales Beispiel geben, dass mit c++98 compiliert aber
> nicht mit c++11?
1
struct C {
2
 const int s;
3
};
4
vector<C> v;
5
...
6
v.push_back(...);
Will moven. Oder war's ein v.remove(...)? Sorry müsste den Source erst 
suchen.
Aber jedenfalls gab es da ja noch dollere Dinger. Siehe Exceptions in 
C++03. Kann man wohl nur froh sein, das nicht mitgemacht zu haben. Das 
wäre ein sinnvolles Betätigungsfeld: Eine noexcept-Variante der Stdlib. 
Obwohl man, wenn man die cycles zählt vermutlich sowieso seine eigenen 
Container mit weniger Speicheroverhead nutzt.

Was sagt modernes C++ denn so? Gibt's mittlerweile iconv integriert?

von Oliver S. (oliverso)


Lesenswert?

zer0 schrieb:
> Sorry müsste den Source erst
> suchen.

Mach mal. Das würde mich auch interessieren...
Und welcher Compiler wars denn?

Oliver

von mh (Gast)


Lesenswert?

zer0 schrieb:
> mh schrieb:
>> zer0 schrieb:
>> opravo schrieb:
>> C++ aktualisieren ohne Abwärtskompatibilität?
>>
>> Ist doch Gang und Gebe. Schon seit C++-11 funktionieren keine Container
>> mehr, die structs mit mindestens einem const-member enthalten. Mit
>> Copy-Construct ging das noch. Mit move nicht mehr.
>>
>> Kannst du ein minimales Beispiel geben, dass mit c++98 compiliert aber
>> nicht mit c++11?
> struct C {
>  const int s;
> };
> vector<C> v;
> ...
> v.push_back(...);
> Will moven. Oder war's ein v.remove(...)? Sorry müsste den Source erst
> suchen.
Bis c++11 galt für std::vector<T>, dass T copy constructible and 
assignable sein muss.

> Aber jedenfalls gab es da ja noch dollere Dinger. Siehe Exceptions in
> C++03. Kann man wohl nur froh sein, das nicht mitgemacht zu haben. Das
> wäre ein sinnvolles Betätigungsfeld: Eine noexcept-Variante der Stdlib.
> Obwohl man, wenn man die cycles zählt vermutlich sowieso seine eigenen
> Container mit weniger Speicheroverhead nutzt.
Ich kann dir nicht wirklich folgen. Was ist/war das Problem?

> Was sagt modernes C++ denn so? Gibt's mittlerweile iconv integriert?
Mit iconv meinst du: https://en.wikipedia.org/wiki/Iconv ? Warum braucht 
möchte man das integriert in die Sprache?

von Timm R. (Firma: privatfrickler.de) (treinisch)


Lesenswert?

Hallo,

ich bin ein bisschen verwirrt, ich hatte gedacht, dass Du die Tatsache, 
dass so ein Sch*** nicht geht als Feature verstanden hast:

zer0 schrieb:

>
1
> struct C {
2
>  const int s;
3
> };
4
> vector<C> v;
5
> ...
6
> v.push_back(...);
7
>

aber bist Du ganz sicher, dass das jemals funktioniert hat? Also bei mir 
jedenfalls hat das nie funktioniert, da bin ich ziemlich sicher. Mein 
aktueller gcc98 liefert dazu, oder besser gesagt zum MCE:
1
#include <iostream>
2
#include <vector>
3
#include <algorithm>
4
5
struct Foo {
6
    const int id_;
7
public:
8
    Foo()
9
    : id_(42) {
10
    }
11
};
12
13
std::vector<Foo> foo_vector;
14
15
int main(int argc, const char * argv[]) {
16
    std::swap(*foo_vector.begin(), *(foo_vector.begin() + 1));
17
    return 0;
18
}

Cannot define the implicit copy assignment operator for 'Foo', because 
non-static const member 'id_' cannot use copy assignment operator.

Womit gcc98 ja auch absolut recht hat.

Clang C++11 und C++14 liefern
No matching function for call to 'swap'
Womit sie ja auch absolut recht haben.

Irgendwo verstehe ich garnicht, worum es da gehen soll, was für einen 
Sinn sollte ein non-static const member haben, den man in einen Vector 
kopieren will? Das ist doch einfach Nonsens und war schon immer Nonsens 
und sonst muss man die Klasse halt entsprechend ausstatten, dass es 
geht, warum auch immer man das wollen können sollte.

Oder halt einen Pointer verwenden.

Vlg
 Timm

: Bearbeitet durch User
von zer0 (Gast)


Lesenswert?

Timm R. schrieb:
> Hallo,
>
> ich bin ein bisschen verwirrt, ich hatte gedacht, dass Du die Tatsache,
> dass so ein Sch*** nicht geht als Feature verstanden hast:
>
> zer0 schrieb:
>
>>> struct C {
>>  const int s;
>> };
>> vector<C> v;
>> ...
>> v.push_back(...);
>>
> aber bist Du ganz sicher, dass das jemals funktioniert hat? Also bei mir
> jedenfalls hat das nie funktioniert, da bin ich ziemlich sicher. Mein
> aktueller gcc98 liefert dazu, oder besser gesagt zum MCE:#include
> <iostream>
> #include <vector>
> #include <algorithm>
>
> struct Foo {
>     const int id_;
> public:
>     Foo()
>     : id_(42) {
>     }
> };
>
> std::vector<Foo> foo_vector;
>
> int main(int argc, const char * argv[]) {
>     std::swap(*foo_vector.begin(), *(foo_vector.begin() + 1));
>     return 0;
> }
>
> Cannot define the implicit copy assignment operator for 'Foo', because
> non-static const member 'id_' cannot use copy assignment operator.
>
> Womit gcc98 ja auch absolut recht hat.
>
> Clang C++11 und C++14 liefern
> No matching function for call to 'swap'
> Womit sie ja auch absolut recht haben.
>
> Irgendwo verstehe ich garnicht, worum es da gehen soll, was für einen
> Sinn sollte ein non-static const member haben, den man in einen Vector
> kopieren will? Das ist doch einfach Nonsens und war schon immer Nonsens
> und sonst muss man die Klasse halt entsprechend ausstatten, dass es
> geht, warum auch immer man das wollen können sollte.
>
> Oder halt einen Pointer verwenden.
>
> Vlg
>  Timm

Hmm, ich glaub' da müsstest du schon eine ältere VC-Variante oder einen 
"ebenbürtigen" gcc zücken. CopyAssignable usw. sind die Konzepte aus dem 
C++11-Standard. Ein "guter, alter" stl-container muss nirgendwo 
unbedingt eine Zuweisung a=b machen und tut es deswegen auch nicht. Oder 
wo brauchte man explizit a=b, ohne dass construct(&a,b) ginge? Das ist 
doch move-only!
--
Ziel der Übung ist selbstverständlich das Key-Element einer struct 
konstant zu halten und die Dinger in einem vector zu speichern quasi als 
(im konkreten Fall) besseres std::set.


Lustig finde ich übrigens das hier:
CopyAssignable: "Given t, a modifiable lvalue expression of type T ... t 
= rv ... (is a valid expression)".
=>
"Given t, a modifiable lvalue expression of type 'const int' ... t = 
rv ... is a valid expression". Schiene mir ja zuzutreffen... Jetzt muss 
ich erstmal überlegen, was die wohl mit "modifiable" meinen :)

von zer0 (Gast)


Lesenswert?

mh schrieb:
> Bis c++11 galt für std::vector<T>, dass T copy constructible and
> assignable sein muss.

Echt?! Wozu das denn? Eine zwingende Notwendigkeit gibt es doch erst mit 
den move-Semantics oder meinst du jetzt auf dem Papier?

mh schrieb:
> Ich kann dir nicht wirklich folgen. Was ist/war das Problem?

Dass da offensichtlich gerne mal im großen Maßstab hin- und dann wieder 
zurück gerudert wird, was mich ja ggf. gewaltig ärgern würde:

mh schrieb:
> Mit iconv meinst du: https://en.wikipedia.org/wiki/Iconv ? Warum braucht
> möchte man das integriert in die Sprache?

War doch ein naheliegender Gedanke, oder nicht? Könnte man doch als 
Vorschlag zum Ersatz von codecvt* einreichen.

von Timm R. (Firma: privatfrickler.de) (treinisch)


Lesenswert?

zer0 schrieb:
> Hmm, ich glaub' da müsstest du schon eine ältere VC-Variante oder einen
> "ebenbürtigen" gcc zücken.

Nee, der C++98 Standard genügt völlig: 23.1.3: The type of objects 
stored in these components must meet the requirements of 
CopyConstructible types (20.1.3), and the additional requirements of 
Assignable types.

Fertig. Dein Beispiel erfüllt diese Anforderung nicht. Das wars. Nichts 
mit bösen C++11 Erfindungen.

> CopyAssignable usw. sind die Konzepte aus dem
> C++11-Standard.

Nö, ist bei 2003 auch schon drin.

> Ein "guter, alter" stl-container muss nirgendwo
> unbedingt eine Zuweisung a=b machen und tut es deswegen auch nicht. Oder
> wo brauchte man explizit a=b, ohne dass construct(&a,b) ginge

Jetzt im Ernst? Eine Zuweisung auf ein bestehendes Objekt, eine der 
wesentlichen Operationen, mit dtor/ctor? Genial.

Viele liebe Grüße
Timm

von MaWin (Gast)


Lesenswert?

Mod schrieb:
> , die sollten lieber mal veraltete Dinge über Bord werfen

Damit sich alte Programm(teil)e nicht mehr kompilieren lassen.
Wie dumm ist das denn. (ich habe z.B. letzte Woche mal wieder schnellen 
getesteten Datenbankcode von 1997 in mein Projekt übernommen weil in den 
letzten 20 Jahren von der open source Community nichts brauchbareres 
geschaffen wurde, der war noch so alt, dass ein Define ihn K&R 
kompatibel machte)
Nicht ohne Grund laufen auch heute noch viele COBOL Programme, weil das 
einen Wert darstellt, Abermilliarden stecken in altem Code.
Schlimm genug, dass manche C++ Programme manche Konstrukte die sie 
ehemals übersetzen konnten (und sich meist für eine Interpretation des 
Standards entschieden) heute mit Fehler abweisen.

von zer0 (Gast)


Lesenswert?

Timm R. schrieb:
> Fertig. Dein Beispiel erfüllt diese Anforderung nicht. Das wars. Nichts
> mit bösen C++11 Erfindungen.

Und wie sollte der Compiler das ohne concepts merken können? Jedenfalls 
nicht anhand der Operationen, die wirklich ausgeführt wurden!

Timm R. schrieb:
> Jetzt im Ernst? Eine Zuweisung auf ein bestehendes Objekt, eine der
> wesentlichen Operationen, mit dtor/ctor? Genial.

Wieso denn "bestehendes Objekt"? Ich kann dir nicht folgen...

Beitrag #5137754 wurde von einem Moderator gelöscht.
Beitrag #5137790 wurde von einem Moderator gelöscht.
Beitrag #5137840 wurde von einem Moderator gelöscht.
Beitrag #5137844 wurde von einem Moderator gelöscht.
Beitrag #5137913 wurde von einem Moderator gelöscht.
Beitrag #5138086 wurde von einem Moderator gelöscht.
Beitrag #5139170 wurde von einem Moderator gelöscht.
Beitrag #5140107 wurde von einem Moderator gelöscht.
Beitrag #5140391 wurde von einem Moderator gelöscht.
Beitrag #5140395 wurde von einem Moderator gelöscht.
Beitrag #5140415 wurde von einem Moderator gelöscht.
Beitrag #5140438 wurde von einem Moderator gelöscht.
Beitrag #5140443 wurde von einem Moderator gelöscht.
Beitrag #5142604 wurde von einem Moderator gelöscht.
Beitrag #5143779 wurde von einem Moderator gelöscht.
Beitrag #5143786 wurde von einem Moderator gelöscht.
Beitrag #5144971 wurde von einem Moderator gelöscht.
Beitrag #5144972 wurde von einem Moderator gelöscht.
Beitrag #5144986 wurde von einem Moderator gelöscht.
Beitrag #5145006 wurde von einem Moderator gelöscht.
Beitrag #5145185 wurde von einem Moderator gelöscht.
Beitrag #5145219 wurde von einem Moderator gelöscht.
Beitrag #5145226 wurde von einem Moderator gelöscht.
Beitrag #5145796 wurde von einem Moderator gelöscht.
Beitrag #5145823 wurde von einem Moderator gelöscht.
Beitrag #5145933 wurde von einem Moderator gelöscht.
Beitrag #5145958 wurde von einem Moderator gelöscht.
Beitrag #5145980 wurde von einem Moderator gelöscht.
Beitrag #5146033 wurde von einem Moderator gelöscht.
Beitrag #5148053 wurde von einem Moderator gelöscht.
Beitrag #5148067 wurde von einem Moderator gelöscht.
Beitrag #5149250 wurde von einem Moderator gelöscht.
Beitrag #5149288 wurde von einem Moderator gelöscht.
Beitrag #5149353 wurde von einem Moderator gelöscht.
Beitrag #5149372 wurde von einem Moderator gelöscht.
Beitrag #5149389 wurde von einem Moderator gelöscht.
Beitrag #5149391 wurde von einem Moderator gelöscht.
Beitrag #5149392 wurde von einem Moderator gelöscht.
Beitrag #5149413 wurde von einem Moderator gelöscht.
Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.