这仅仅是当前限制还是有技术原因?当泛型函数被编译为专用代码时,我看不出有什么应阻止它起作用。它在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);
}
简短的回答:由于难以正确处理,因此尚未实施。甚至还有一个开放的RFC,名为“依赖于通用代码中类型参数的常量”。
长答案:
这曾经是导致编译器崩溃的编译器错误。它由PR 25091中的@quantheory“修复”,是将其变为错误而不是崩溃。@quantheory评论说
我尚未能够为关联的const处理数组大小或递归问题,尽管我希望我对范围匹配模式所做的更改也可能有助于数组大小。
@quantheory还指出,除非合并了RFC 1062中的某些内容,否则这将是一个错误。人们总是赞赏对RFC的评论,因为它们可能会提示被遗忘的用例。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句