Невозможно создать константу, используя mem :: size_of внутри функции с типом sizei c (E401) - PullRequest
3 голосов
/ 19 января 2020

У меня есть программа Rust, в которой я пытался использовать константные функции в качестве альтернативы макросам для генерации различных констант во время компиляции (что до сих пор шло отлично), но я только что наткнулся на контрольно-пропускной пункт, где фрагмент ниже не будет скомпилирован, потому что size_of принимает параметр generi c, а компилятор говорит, что я не могу использовать один из сигнатуры функции:

const fn _IOC<T:Sized>(dir:u32, code:u8, nr:u8) -> u32 {
    // use of generic parameter from outer function (E0401)
    const size: usize = ::core::mem::size_of::<T>();

    (dir  << 30) | ((size as u32) << 16) | ((code as u32) << 8) | ((nr as u32))
}

#[cfg(test)]
mod tests {
    use super::*;

    #[test]
    fn it_works() {
        let myioctl = _IOC::<[u8; 65]>(3, b'H', 0x06);
        assert_eq!(myioctl, 0xC0414806);
    }
}

Это ошибка:

error[E0401]: can't use generic parameters from outer function
 --> src/lib.rs:3:48
  |
1 | const fn _IOC<T:Sized>(dir:u32, code:u8, nr:u8) -> u32 {
  |               - type parameter from outer function
2 |     // use of generic parameter from outer function (E0401)
3 |     const size: usize = ::core::mem::size_of::<T>();
  |                                                ^ use of generic parameter from outer function

Я не уверен, что понимаю, почему эта конкретная c ошибка будет применяться к приведенному выше коду. Должен ли я рассматривать это как крайний случай компилятора, который в настоящее время не поддерживается языком, или есть способ заставить эту работу работать, которую я не вижу?

1 Ответ

3 голосов
/ 19 января 2020

Вы не должны объявлять size как const. Это должна быть обычная постоянная переменная:

let size = ::core::mem::size_of::<T>();

Детская площадка

...