Tôi đang theo dõi một lỗi trong mã của bên thứ ba và tôi đã thu hẹp nó thành một cái gì đó dọc theo dòng.
use libc::c_void;
pub unsafe fn foo() {}
fn main() {
let ptr = &foo as *const _ as *const c_void;
println!("{:x}", ptr as usize);
}
Chạy ổn định 1.38.0, điều này in con trỏ hàm, nhưng beta (1.39.0-beta.6) và trả về hàng đêm '1'. ( Sân chơi )
Điều gì _
được suy luận và tại sao hành vi đã thay đổi?
Tôi giả sử cách chính xác để thực hiện điều này chỉ đơn giản là foo as *const c_void
, nhưng đây không phải là mã của tôi.
let ptr = foo as *const fn() as *const c_void;
foo
đã là một con trỏ hàm, vì vậy bạn không nên lấy địa chỉ của nó. Điều đó tạo ra một tham chiếu kép, dường như là một loại có kích thước bằng không (do đó là giá trị ma thuật1
).