Keyboard shortcuts

Press or to navigate between chapters

Press S or / to search in the book

Press ? to show this help

Press Esc to hide this help

macroless_generic_const_args

Enables implementing const items under #![feature(min_generic_const_args)] and #![feature(generic_const_args)] without the direct_const_arg! macro.

The tracking issue for this feature is: #162540


Warning: This feature is incomplete; its design and syntax may change.

Related features:

  • min_generic_const_args. See that doc for what the direct_const_arg! is. This feature enables support for directly represented const arguments as the rhs of const items without the macro.
  • macroless_generic_const_args. For a version of this feature that works for const arguments in other positions

Examples

Here is an example from min_generic_const_args:

#![allow(incomplete_features)]
#![feature(
    min_generic_const_args,
    generic_const_args,
    macroless_generic_const_args,
    generic_const_items,
)]

trait Trait {
    const ASSOC<const N: usize>: usize;
}

impl Trait for () {
    const ASSOC<const N: usize>: usize = core::direct_const_arg!(N);
}

fn foo<const N: usize>() {
    let a: [(); <() as Trait>::ASSOC::<N>]
        = [(); N];
}

Using #![feature(macroless_const_item_generic_const_args)] enables you to write the above without the macro:

#![allow(incomplete_features)]
#![feature(
    min_generic_const_args,
    generic_const_args,
    macroless_generic_const_args,
    macroless_const_item_generic_const_args,
    generic_const_items,
)]

trait Trait {
    const ASSOC<const N: usize>: usize;
}

impl Trait for () {
    const ASSOC<const N: usize>: usize = N;
}

fn foo<const N: usize>() {
    let a: [(); <() as Trait>::ASSOC::<N>]
        = [(); N];
}