这仅仅是当前的限制还是有技术原因?由于泛型函数被编译为专用代码,我看不出应该阻止它工作的内容。它在main
函数中也可以正常工作。
示例(playground):
#![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);
}
答案 0 :(得分:6)
简短回答:它尚未实施,因为很难做到正确。甚至还有一个名为“Constants that depend on type parameters in generic code”的开放式RFC。
答案很长:
以前是compiler-bug that caused the compiler to crash。 @quantheory在PR 25091中通过使这个错误而不是崩溃来“修复”它。 @quantheory评论说
我还没有能够处理相关争用的数组大小或递归问题,但我希望我对范围匹配模式所做的更改也可能有助于数组大小。
@quantheory还指出,这将保持错误,直到合并RFC 1062的某些内容。关于RFC的评论总是受到赞赏,因为他们可能会忘记用例。