Rusts Const-Generics-Team stellt Generic Const Args als Nachfolger von generic_const_exprs vor
Die Projektgruppe Const Generics von Rust hat das Design beschrieben, das die seit Langem instabile Funktion generic_const_exprs ablösen soll. Ein Beitrag im Blog Inside Rust vom 2. Oktober stellt Generic Const Arguments vor, kurz GCA: eine Familie von Nightly-Funktionen, mit denen mehr Arten von Ausdrücken mit generischen Parametern in Const-Generic-Argumenten stehen dürfen. Erstmals diskutiert wurde der Entwurf im Juni 2024 auf der RustFest Zürich.
Die Grenze, um die es geht. Im stabilen Rust darf ein Const-Generic-Argument ein bloßer Parameter wie { N } oder ein vollständig konkreter Ausdruck wie { 1 + 1 } sein. Typen wie [u8; N + 1] oder [u8; T::NUM_BYTES] sind nicht möglich, was laut Beitrag viele zum Crate typenum treibt.
Was GCA hinzufügt. Jeder neu unterstützte Ausdruck muss in ein Makro gca! gesetzt werden.
gca_adtserlaubt es, Structs, Enums, Tupel und Arrays aus generischen Parametern zu bilden, etwagca!(Foo { field: N })odergca!([N1, 12]). Wiederholungsausdrücke wie[N; 2]werden noch nicht unterstützt.gca_const_itemsmacht Const-Items im Typsystem nutzbar, darunter assoziierte Konstanten ([u8; gca!(T::ASSOC)]) und generische freie Konstanten. Da ein Const-Item beliebigen Code enthalten kann, sind damit indirekt beliebige Ausdrücke möglich:gca!(N + 1)wird abgelehnt,const FOO: usize = N + 1;dagegen lässt sich verwenden. Außerdem erlaubt die Funktion Schranken wieT: Trait<ASSOC = { N }>unddyn-Typen für Traits mit assoziierten Konstanten – beides im stabilen Rust verboten. Sie setzt das instabile-Znext-solvervoraus.- Ein Const-Item, dessen rechte Seite selbst ein
gca!-Ausdruck ist, wird transparent behandelt: Der Compiler kann beweisen, dass[u8; FREE_GCA::<N>]und[u8; N]derselbe Typ sind. Ein gewöhnliches Const-Item bleibt undurchsichtig, und derselbe Vergleich scheitert. gca_min_const_itemsist eine kleinere Variante, die nur Const-Items mitgca!-Ausdrücken annimmt und ohne den neuen Trait-Solver auskommt.
Was es beim Schreiben kostet. Innerhalb von gca! sind Arithmetik und Funktionsaufrufe nicht erlaubt: gca!(1 + 1) ist ein Fehler, { 1 + 1 } nicht. Das Team schreibt, die Pflicht zum Makro bereite erhebliche ergonomische Probleme, und eine Lösung dafür sei noch nicht gefunden.

Was das bedeutet
Nichts davon ist stabil, und der Beitrag erklärt ein Design, er nennt keinen Zeitplan. Für Bibliotheksautoren liegt sein Wert in der Richtung: Das lange Experiment generic_const_exprs hat einen Nachfolger, und berechnete Array-Längen werden über Const-Items laufen statt über frei eingeschriebene Arithmetik. Code, der auf typenum aufbaut, hat noch keinen Grund umzuziehen.