< 返回版块

sega 发表于 2020-11-14 17:20

struct Person {
 age: u8
}

我想简单得创建一个Person的引用的集合

let mut person_list: Vec<&Person> = vec![];
person_list.push(&Person { age: 21 });
person_list.push(&Person { age: 11 });

上面的写法是可以的。但是如果使用借用的话:

let mut person_list: Vec<&mut Person> = vec![];
person_list.push(&mut Person { age: 21 });
person_list.push(&mut Person { age: 11 });

就会报temporary value is freed at the end of this statement错误

person_list.push(&mut Person { age: 21 });
   |                           ^^^^^^^^^^^^^^^^^^ - temporary value is freed at the end of this statement
   |                           |
   |                           creates a temporary which is freed while still in use
49 |     person_list.push(&mut Person { age: 11 });
   |     ----------- borrow later used here

我想请问一下,为什么第一种方法,我传了临时值的引用却不会报错,但是传临时值的借用却不行??谢谢


还有就是

fn get_person<'a>() -> &'a Person {
    return &Person { age: 21 };
}

如果我这样调用的话,我返回了一个函数内部临时变量的引用,但是没问题,好像编译器把这个不可变引用的生命周期给提升了。

fn get_person<'a>() -> &'a mut Person {
    return &mut Person { age: 21 };
}

但是返回&mut就会报错了,另我比较疑惑。

评论区

写评论
作者 sega 2020-11-15 12:31

理解了,感谢

--
👇
yct21:

我想简单得创建一个Person的引用的集合

let mut person_list: Vec<&Person> = vec![];
person_list.push(&Person { age: 21 });
person_list.push(&Person { age: 11 });

上面的写法是可以的。但是如果使用借用的话:

这里应该是发生了 constant promotion

如果写成以下方式的话,会出现编译错误:

let mut person_list: Vec<&Person> = vec![];
let age_1 = 21;
person_list.push(&Person { age_1 });
person_list.push(&Person { age: 11 });

第二个同理

fn get_person<'a>() -> &'a Person {
    return &Person { age: 3u8.pow(2) }; // cannot return reference to temporary value
}
yct21 2020-11-14 20:28

我想简单得创建一个Person的引用的集合

let mut person_list: Vec<&Person> = vec![];
person_list.push(&Person { age: 21 });
person_list.push(&Person { age: 11 });

上面的写法是可以的。但是如果使用借用的话:

这里应该是发生了 constant promotion

如果写成以下方式的话,会出现编译错误:

let mut person_list: Vec<&Person> = vec![];
let age_1 = 21;
person_list.push(&Person { age_1 });
person_list.push(&Person { age: 11 });

第二个同理

fn get_person<'a>() -> &'a Person {
    return &Person { age: 3u8.pow(2) }; // cannot return reference to temporary value
}
1 共 2 条评论, 1 页