Ответ 1
Вы правы. В этом случае foo
вызывается первым, а затем RawLayout
. Это объясняется в Ссылка на ржавчину (перейдите по ссылке, чтобы увидеть конкретные примеры того, как это получается на практике):
Время жизни временных значений, как правило, является самым внутренним Заявление
Однако я предпочел бы следовать совету Шеммастера. Явное введение локальной переменной помогло бы читателю сконцентрироваться на более важных вещах, например, убедиться, что небезопасный код верен (вместо того, чтобы определить точную семантику временных переменных).
Как проверить этот
Вы можете использовать приведенный ниже код, чтобы проверить это поведение:
struct Layout;
struct RawLayout;
impl Into<RawLayout> for Layout {
fn into(self) -> RawLayout {
RawLayout
}
}
impl Drop for RawLayout {
fn drop(&mut self) {
println!("Dropping RawLayout");
}
}
unsafe fn foo(layout: *const RawLayout) -> u8 {
println!("foo called");
1
}
fn bar(layout: Layout) -> bool {
unsafe {
foo(&layout.into() as *const _) != 0
}
}
fn main() {
bar(Layout);
}
Вывод:
foo called
Dropping RawLayout