Почему связанные константы не зависят от параметров типа?

Это просто ограничение тока или есть техническая причина? Поскольку обобщенные функции компилируются в специализированный код, я не вижу, что должно помешать ему работать. Он также отлично работает в функции main.

Пример (игровая площадка):

#![feature(associated_consts)]
trait HasNumber<T> {
    const Number: usize;
}

enum One {}
enum Two {}

enum Foo {}

impl<T> HasNumber<One> for T {
    const Number: usize = 1;
}

impl<T> HasNumber<Two> for T {
    const Number: usize = 2;
}

fn use_number<T, H: HasNumber<T>>() {
    let a: [u8; H::Number] = unsafe { ::std::mem::uninitialized() };
}

fn main() {
    let a: [u8; <Foo as HasNumber<One>>::Number] = unsafe { ::std::mem::uninitialized() };
    println!("{}", <Foo as HasNumber<One>>::Number); 
    println!("{}", <Foo as HasNumber<Two>>::Number);    
}

Ответ 1

Короткий ответ: он еще не реализован, так как трудно получить право. Там даже открытый RFC с именем "Константы, которые зависят от параметров типа в общем коде" для него.

Длинный ответ:

Это был компилятор, который вызвал сбой компилятора. Он был "исправлен" @quantheory в PR 25091, сделав это ошибкой, а не сбоем. @quantheory прокомментировал, что

Мне еще не удалось решить проблему с размером массива или рекурсией для связанных констант, хотя я надеялся, что изменение, которое я сделал для шаблонов соответствия диапазонов, также может помочь в размерах массивов.

@quantheory также отмечает, что это будет оставаться ошибкой до тех пор, пока что-то вроде RFC 1062 не будет объединено. Комментарии к RFC всегда приветствуются, так как они могут затуманить забытые варианты использования.