2016-12-27 18 views
8

Xem mã này:Tương đương với constexpr từ C++?

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

rustc đầu ra mà

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

Nhưng something_const là không năng động, bởi vì nó được biết đến tại thời gian biên dịch.

Có tương đương với Rust của cơ chế C++ constexpr không?

Trả lời

10

constexpr trong C++ có thể được sử dụng trong 2 tình huống khác nhau:

  • để đủ điều kiện một hằng số, và biểu thị hằng số này phải có sẵn tại thời gian biên dịch
  • để đủ điều kiện một chức năng, và biểu thị rằng đây chức năng phải có sẵn để đánh giá thời gian biên dịch

Rust hỗ trợ cả, mặc dù trong một thời trang có giới hạn:

  • bạn có thể sử dụng const để khai báo một hằng số, thay vì let, tuyên bố rằng nó là thực sự liên tục
  • về đêm, bạn có thể sử dụng const để đủ điều kiện một chức năng, tuyên bố rằng nó có thể được đánh giá ở thời gian biên dịch

Trong trường hợp của bạn, bạn muốn sử dụng đầu tiên:

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

Lưu ý rằng không giống như với let, nó là bắt buộc để chú thích các liên tục với nó kiểu.

Ngoài ra, trình biên dịch sẽ khiếu nại về việc đặt tên; hằng số sử dụng ALL_CAPS.

+0

Quá xấu đến mức hàm const rất hạn chế ngay cả vào ban đêm. Về cơ bản chỉ có đệ quy đuôi. –

+1

@AleksanderFular: Có công việc liên tục trên một bộ đánh giá liên tục rất có khả năng được gọi là [miri] (https://github.com/solson/miri) (aka, MIR interpreter). Bây giờ, cộng đồng Rust chủ yếu là nội dung để "chờ đợi" và xem solson và thử nghiệm oli-obk và xem những gì có thể, những gì không, những gì quá tốn kém, những cạm bẫy, vv ... lưu ý rằng MIRI là đáng kể hơn tiên tiến hơn so với C++ 's constexpr: nó xử lý phân bổ bộ nhớ! –

+0

@AleksanderFular: Kể từ khi tôi đi qua ... dự án [MIRI] (https://github.com/solson/miri), một thông dịch viên cho MIR Đại diện trung gian cấp trung được sử dụng bởi rustc, đã hạ cánh trong rustc, và đã 1,24 đã ổn định một số chức năng như 'const' như' mem :: size_of'. –

Các vấn đề liên quan