2015-06-08 1 views
10

Это просто ограничение тока или есть техническая причина? Поскольку общие функции скомпилированы в специализированный код, я не вижу, что должно помешать ему работать. Он также отлично работает в функции 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

Ну, первое, что меня поражает, это то, что связанные consts определяют константу в части i.e 'HasNumber for Two', а не' HasNumber для T'. Однако я уже встречался с некоторыми ICE здесь, поэтому я думаю, что эта функция очень новая. –

+0

Спасибо, что комментарий PR отвечает на мой вопрос. – Ferio

ответ

6

Короткий ответ: Это еще не реализован, так как трудно получить право. Для этого есть даже открытый RFC с именем «Constants that depend on type parameters in generic code».

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

Это имело обыкновение быть compiler-bug that caused the compiler to crash. Он был «исправлен» @quantheory в PR 25091, сделав вместо этого ошибку. @quantheory отметил, что

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

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

Смежные вопросы