2016-12-27 10 views
8

Zobacz ten kod:Odpowiednik constexpr z C++?

fn main() { 
    let something_const = 42; 
    fn multiply(nbr: i32) -> i32 { 
     nbr * something_const 
    } 
    println!("{}", multiply(1)); 
} 

rustc wyjścia że

error[E0434]: can't capture dynamic environment in a fn item; use the || { ... } closure form instead 
    --> main.rs:19:15 
    | 
19 |   nbr * something_const 
    |    ^^^^^^^^^^^^^^^ 

Ale something_const nie jest dynamiczny, ponieważ jest znany w czasie kompilacji.

Czy jest równoważny w Rust mechanizmu C++ constexpr?

Odpowiedz

10

constexpr C++ może być stosowany w 2 różnych sytuacjach:

  • zakwalifikowania stałej, i oznaczają, że stały musi być dostępny w czasie kompilacji
  • , aby zakwalifikować się do funkcji, i oznaczają, że funkcja musi być dostępny dla oceny kompilacji

Rust obsługuje oba, choć w ograniczonym zakresie:

  • można użyć const zadeklarować stałą, zamiast let, aby oświadczyć, że jest naprawdę stała
  • na nocnej, można użyć const aby zakwalifikować się do funkcji, do stwierdzenia, że ​​to może być oceniane w czasie kompilacji

W sytuacji, chcesz pierwszy Zastosowanie:

fn main() { 
    const something_const: i32 = 42; 
    fn multiply(nbr: i32) -> i32 { 
     nbr * something_const 
    } 
    println!("{}", multiply(1)); 
} 

Należy zauważyć, że w przeciwieństwie do let, obowiązkowe jest opisywanie stały z jej rodzaj.

Ponadto kompilator będzie skarżył się na nazewnictwo; stałe używają ALL_CAPS.

+0

Szkoda, że ​​funkcje const są tak ograniczone, nawet w nocy. Zasadniczo tylko rekursja ogona. –

+1

@AleksanderFular: Trwają prace nad bardzo zdolnym, stałym ewaluatorem o nazwie [miri] (https://github.com/solson/miri) (aka, interpreter MIR). Na razie społeczność Rusta jest zadowolona z "czekania na nią" i oglądania eksperymentów Solsona i oli-obka i zobaczenia, co jest możliwe, co nie jest, co za drogie, jakie są pułapki, itp ... zauważ, że MIRI jest znacznie bardziej zaawansowane niż C++'s constexpr: obsługuje alokację pamięci! –

+0

@AleksanderFular: Od kiedy przejeżdżałem ... projekt [MIRI] (https://github.com/solson/miri), tłumacza MIR reprezentatywnego pośredniego poziomu średniego, używanego przez rustc, wylądował w rustc, a już 1.24 ustabilizowało garść funkcji jako "const" takich jak 'mem :: size_of'. –