Обсуждалось. https://github.com/rust-lang/rfcs/pull/1933Это очень удобная фишка, которая позволяет, например, объявлять типы параметризованные значением. Не другим типом, а значением.
Там в rfc неплохой пример есть:
impl<const n: usize, T: Clone> Clone for [T; n] {
fn clone(&self) -> [T; n] {
// Clone it...
}
}
Так могла бы выглядеть реализация трейта Clone, создающего копию объекта, для всех возможных типов слайсов. Сейчас в стандартной библиотеке rust'а, есть *33* реализации трейта PartialEq (это операция ==) для слайсов с размерами от 1 до 32. Да, конечно, там не 33 раза написано impl PartialEq for ... бла-бла-бла..., там ради такого написано макрос принимающий в качестве параметра значение типа usize.
Собственно за подробностями можно сходить сюда: https://doc.rust-lang.org/src/core/array.rs.html
И найти там строчки https://doc.rust-lang.org/src/core/array.rs.html#213-218 :
array_impls! {
0 1 2 3 4 5 6 7 8 9
10 11 12 13 14 15 16 17 18 19
20 21 22 23 24 25 26 27 28 29
30 31 32
}
Это, так сказать, квинтэссенция всего предыдущего макрописания. Раскрытие этого макроса компилятором приводит к появлению 33*16 отдельных блоков impl (33 значения для N, и, если я не сбился со счёта, 16 трейтов, типа AsRef, AsMut, Borrow, BorrowMut, PartialEq...), каждый из которых реализует 1-2 функции.
Можно такие штуки делать макросами, но это раздувает код. И это работает только для конечного числа значений n. С зависимыми типами можно будет обойтись без макросов и написать 16 блоков impl, по одному на каждый трейт реализуемый слайсом, а затем компилятор уже будет инстанцировать эти реализации _по_мере_необходимости_.