Sind die experimentellen Funktionen von modernem C ++ für langfristige Projekte zuverlässig?


86

Ich habe ein Projekt, das derzeit C ++ 11/14 verwendet, aber es erfordert so etwas wie std::filesystem, das nur in C ++ 17 verfügbar ist, und daher habe ich keine Chance, es derzeit zu verwenden. Ich sehe jedoch, dass es in meinem aktuellen Compiler als verfügbar ist std::experimental::filesystem. Ist es eine gute Idee, experimentelle Funktionen zu verwenden, vorausgesetzt, ich könnte in Zukunft etwas hinzufügen wie:

#ifdef CXX17 //if this is C++17
std::filesystem::something ...;
#else
std::experimental::filesystem::something ...;
#endif

Meine Bedenken sind:

1. Ist garantiert, dass alle kompatiblen Compiler die gleichen experimentellen Funktionen haben?

2. Sind experimentelle Merkmale anfällig für große Änderungen, die sie unzuverlässig machen?

Vielleicht gibt es noch mehr Dinge, über die man sich wundern muss. Warum sollte ich sie benutzen oder nicht? Ich bin verwirrt über ein neues Projekt und weiß nicht, was ich entscheiden soll.


24
Beantwortet das Wort experimentell nicht Ihre Fragen?
101010

6
Hauptsächlich Geschmackssache, aber ich würde es vermeiden, den Code damit zu überladen #idef CXX17. IMHO besteht die tragbare Möglichkeit darin, den gesamten dateisystembezogenen Code in einer einzigen Kompilierungseinheit (möglicherweise eine Klasse) abzulegen, ihn in den verbleibenden Teilen des Codes zu verwenden und ihn mit dem aktuellen C ++ 11/14-Standard zu codieren. Dokumentieren Sie, warum und warum Sie es so schreiben, und portieren Sie es später während einer Wartungsphase auf C ++ 17, wenn es sinnvoll ist. (Kommentar zur ursprünglichen Frage)
Serge Ballesta

4
Als Kandidat war es nur "experimentell", in den Standard einzutreten. Es spiegelt nicht die Qualität des Codes wider.
Galik

5
Es gab einige Änderungen zwischen der "experimentellen" und der endgültigen C ++ 17-Version, siehe Dokument P0492R1
Bo Persson,

7
Im Fall von filesystemIhnen entstehen weit weniger Risiko darin als andere Dinge verwenden, wie Sie bereits wissen , dass es in C standardisiert wird ++ 17, und die genaue C ++ 17 - Spezifikation davon ist öffentlich zugänglich. Sie müssen also nur sicherstellen, dass Sie nur die experimental::filesystemFunktionen verwenden, die in der C ++ 17-Spezifikation enthalten sind. Und natürlich müssen Sie wissen, dass alle Ihre Zielplattformen eine experimental::filesystemoder mehrere C ++ 17- Plattformen unterstützen std::filesystem.
Howard Hinnant

Antworten:


79
  1. Ist garantiert, dass alle kompatiblen Compiler die gleichen experimentellen Funktionen haben?

Nein, experimentelle Funktionen sind optional.

  1. Sind experimentelle Merkmale anfällig für große Änderungen, die sie unzuverlässig machen?

Ja, das C ++ - Komitee könnte sogar beschließen, ein Feature aufzugeben, oder im Zuge der Standardisierung könnte ein Fehler auftreten, der eine Änderung des Features erzwingen würde.

Im Allgemeinen ist es keine gute Idee, sich auf experimentelle Merkmale zu verlassen. Experimentelle Merkmale sind genau das, was das Wort sagt (dh um damit zu experimentieren).


2
In Bezug auf den zweiten Punkt beachten Sie bitte, dass es sich um Funktionen handelt, die bereits akzeptiert wurden, aber möglicherweise anders sind.
Der Quantenphysiker

14
@TheQuantumPhysicist: "bereits akzeptiert" ist ein kniffliges Konzept. Alles kann jederzeit durch spätere Annahme einer Änderung entfernt werden, um es zu entfernen, und dies ist jedem Standard passiert. Sie möchten wahrscheinlich mindestens bis zum Entwurf des internationalen Standards warten, bevor der Funktionsumfang einigermaßen zuverlässig ist.
Kerrek SB

1
@ KerrekSB: Meinen Sie nicht den Final Draft International Standard, auch bekannt als FDIS. ? Das Zeichnen ist ein ziemlich permanenter Prozess.
MSalters

1
@ MSalters: Nein, die DIS ist wahrscheinlich gut genug, wenn Sie es eilig haben. Und diesmal haben wir vielleicht sowieso kein FDIS.
Kerrek SB

4
@KerrekSB: Ich war so ziemlich die nationale Stelle für die Niederlande um C ++ 03;). Wir hatten einen nationalen Sekretär für SC22, der über ISO-Verfahren und die Beantwortung eines FDIS Bescheid wusste, aber nicht was. Außer unserem WG14-Delegierten Randy Marques wusste keiner unserer SC22-Delegierten etwas über C ++. Und Randy machte sich nur über die Tatsache lustig, dass C ++ mehr Seiten benötigen würde, um alle seine UB zu definieren, als C für das definierte Verhalten benötigt - würde nicht wollen, dass er auf dieses FDIS antwortet;)
MSalters

50

Jemand aus dem Publikum stellte während des Vortrags "C ++ Standard Library Panel" auf der CppCon 2016 ( YouTube ) eine Frage zum Potenzial des Namens experimental, Benutzer davon abzuhalten , irgendetwas innerhalb des Namespace zu verwenden:

Hält ihr [den Inhalt des std::experimentalNamespace] für produktionsbereit und ist das ein Argument, das vorgebracht werden kann, [dass] es für die nächsten 3 Jahre effektiv produktionsbereit ist, und vielleicht müssen Sie Ihren Code 3 Jahre später ändern, vielleicht?

Michael Wong (Vorsitzender von SG5 und SG14 und Herausgeber der Concurrency TS) stellte zunächst die Frage:

Ich denke, innerhalb des Komitees herrscht starker Konsens darüber, dass es praktisch produktionsbereit ist. Wie ich bereits sagte, werden in den meisten Fällen 99% davon in die Luft geschleudert. Wir möchten sicherstellen, dass es für Sie kein Hindernis ist, es zu verwenden. Sie können verstehen, warum wir große Features, große Gruppen von Features, in einen solchen Kontext stellen möchten, damit der Rest des gesamten Bibliothekssystems nicht gestört wird, aber es Ihnen auch die Verwendung erleichtert. Jetzt können Sie GCC mit einem bestimmten Flag für Konzepte aktivieren, das es Ihnen tatsächlich erleichtert, es zu segmentieren.

Alisdair Meredith (ehemaliger Vorsitzender der LWG) folgte dann:

Ich werde hier die gegenteilige Position einnehmen. Eines der Dinge, die Herb [Sutter] als Veranstalter von WG21, der Standardgruppe, sagte, als wir uns auf den Weg zu TSes machten, war, dass er nicht glaubte, dass TSes erfolgreich sein werden, bis wir es nicht geschafft haben, etwas voranzubringen, weil es Das heißt, wir sind nicht experimentell genug, wir sind nicht ehrgeizig genug, wofür wir die TSes verwenden. Das wollen wir wirklichexperimentalUm ein Hinweis zu sein, dass sich diese Dinge ändern können, sind wir daran nicht gebunden und können etwas falsch machen. Dies soll unsere Barriere für die Dinge senken, die wir als so ehrgeizig und erreichbar wie möglich betrachten. [...] Jetzt scheint der Standard in einem dreijährigen Veröffentlichungszyklus zu liegen. Wir sollten viel ehrgeiziger sein, wenn es darum geht, wirklich experimentelle Funktionen zu entwickeln in die TS, und vielleicht schneller in den Hauptstandard selbst voranbringen. Aber auch dies wird ein unterhaltsames Thema sein, das wir bei den nächsten [C ++ Standard Committee] -Sitzungen diskutieren werden.

Stephan T. Lavavej (Betreuer der STL-Implementierung von Microsoft) antwortete zuletzt:

Es ist wichtig, zwischen der Experimentierbarkeit der Schnittstelle und der Experimentierbarkeit der Implementierung zu unterscheiden, denn wenn Sie "produktionsbereit" sagen, was bedeutet das? Normalerweise, "produktionsbereit", würden Sie daran denken, dass Sie über die Implementierung sprechen. Es ist durchaus möglich, dass eine Implementierung [von etwas in std::experimental] absolut kugelsicher ist. [...] So etwas wie [...] der <random>Header in TR1, [es war] wirklich sehr, sehr schön in TR1, und Sie hätten eine absolut kugelsichere Implementierung davon haben können, aber es stellte sich heraus, dass die Schnittstelle durcheinander geraten ist Im Wesentlichen [vor der Veröffentlichung von] C ++ 11 und [...] wenn wir damals wüssten, was wir jetzt tun, wäre das Einfügen eines experimentalein besseres Signal für die Leute gewesen: "Hey, vielleicht willst du das nicht verwendenstd::experimental::variate_generator weil, ha-ha, es in C ++ 11 verschwinden wird ".

Es scheint also, dass unter den Standardbibliotheksentwicklern und Komiteemitgliedern ein gewisser Wunsch besteht, dass zumindest in Zukunft der Inhalt des std::experimentalNamespace wirklich "experimenteller" Natur sein sollte und es nicht als selbstverständlich angesehen werden sollte, dass etwas im std::experimentalWillen ist mach es in den C ++ Standard.

Und nein, soweit ich weiß, liegt es an den Standard-Bibliotheksanbietern, ob sie Implementierungen für die verschiedenen darin enthaltenen Funktionen bereitstellen std::experimental.


46
10 Jahre nachdem ich den Namen zum ersten Mal gelesen habe, bringt mich die Tatsache, dass der STL-Betreuer von Microsoft STL heißt, immer noch zum Lachen.
Jörg W Mittag

19
@ JörgWMittag Sie sollten ihren Compiler-Betreuer Michael Sam Victor Collins treffen
MM

28

"Experimentell" ist ein leicht übertriebener Begriff. Die filesystemBibliothek hat ihren Ursprung in Boost und durchlief dort einige Iterationen, bevor sie bei ISO eingereicht wurde.

ISO-Standards sind jedoch absichtlich sehr konservativ. Wenn man es experimentell nennt, verspricht ISO ausdrücklich nicht, dass die Benennung stabil ist. Es ist völlig klar, dass Sie Ihren Code in Zukunft irgendwann neu adressieren müssen. Wenn Sie jedoch ISO kennen, ist es wahrscheinlich, dass es Anleitungen gibt, wie.

Erwarten Sie, dass die Kompatibilität zwischen Compilern angemessen ist. Es wird jedoch Eckfälle geben (z. B. Windows-Laufwerksrelationen), und genau deshalb könnte ein zukünftiger Standard Ihren vorhandenen Code beschädigen. Im Idealfall würde es Ihren Code genau dann beschädigen, wenn Sie von diesem Eckfall abhängen, aber das ist keine Garantie.


8

Vielleicht gibt es noch mehr Dinge, über die man sich wundern muss.

Einige Punkte zu beachten:

  • Wie plattformübergreifend ist Ihr Projekt? Wenn nur ein Compiler beteiligt ist, können Sie dessen Implementierung und Erfolgsbilanz überprüfen, um zu entscheiden. Oder frag sie!

  • Wie groß ist Ihre Codebasis? Wie groß wären die Auswirkungen von Änderungen?

  • Wie grundlegend für Ihr Projekt sind die Funktionen, die von der API / Bibliothek / Funktion bereitgestellt werden?

  • Was sind die Alternativen?

    • Verwenden Sie die experimentelle Funktion und passen Sie den Code an Änderungen an, wenn er standardisiert wird. Könnte so einfach wie das Löschen experimental::oder das Erzwingen von Problemumgehungen sein.
    • Fügen Sie eine Abstraktionsschicht hinzu (Kommentar von Serge Ballesta). Wenn sich die experimentelle Funktion ändert, werden Ihre Umschreibungen isoliert. Bei einer Standardfunktion kann es sich um einen Overkill handeln (std :: filesystem ist bereits eine Abstraktionsschicht ...).
    • Verwenden Sie eine andere API / Bibliothek. Gleiche Fragen: Reife? Robustheit? Stabilität? Portabilität? Benutzerfreundlichkeit? Eigenschaften?
  • Im Fall von std :: filesystem (oder dem Netzwerk-TS) gibt es boost :: filesystem (bzw. boost :: asio) als Alternative oder Fallback, falls das experimentalSystem ausfällt oder verschwindet.
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.