Avatar von Jonny Dee
  • Jonny Dee

585 Beiträge seit 07.02.2008

Re: Real-World-Beispiele? Wo man "consteval" wirklich _braucht_?

Tim Peters schrieb am 13.07.2020 18:34:

Wenn du irgendwo ein herkömmliches Array mit fester Größe definierst:

char buf[bytes_for_int(3)] {};

Und bytes_for_int() sieht so aus:

constexpr auto bytes_for_int(const size_t count) { return count * sizeof(int); }

Dann macht es einen RIESEN-Unterschied, ob das jetzt constexpr oder consteval ist!

Denn im obigen Falle bei constexpr würde ein unerfahrener Entwickler ein Array evtl. mit einer Laufzeitvariablen anzulegen versuchen:

char buf[bytes_for_int(var)] {};

Das würde - nur bei constexpr - zur Laufzeit ausgewertet werden, und dafür sorgen, dass das Array keine statische Größe hat, sondern als VLA behandelt wird!

VLAs gibt es in C++ aber gar nicht! Die wurden - aus guten Gründen - gar nicht aus C in C++ übernommen, und auch bei C sehr zeitnah wieder aus dem Standard geeschmissen.

Das Problem ist, dass alle großen Compiler stillschweigend VLAs unterstützen und nicht mal mit "-Wall -Wextra -Wpedantic" monieren.

Dann setzt man meiner Meinung nach aber an der falschen Stellschraube an. Da VLAs nicht zum C++ Standard gehören, sollte man lieber dafür sorgen, dass die Compiler sich an die Standards halten, statt den Standard dann um ein weiteres Keyword zu erweitern. Das ist doch Unsinn! Wenn die Compiler-Bauer nun meinen sie müssten sich nicht an die Semantik halten, die für das neue "consteval" definiert ist, und behandeln sie identisch zur "constexpr" Semantik, dann führt man in ein paar Jahren noch mal ein neues Keyword ein? Also sowas wie "constexprevalbutreallythistime"?

Bewerten
- +