gpt4 book ai didi

rust - 为什么在需要&Vec <&'a str>的地方使用nomicon布局章节&Vec <&'static str> couldn'?

转载 作者:行者123 更新时间:2023-12-03 11:34:05 25 4
gpt4 key购买 nike

https://doc.rust-lang.org/nomicon/vec-layout.html
我不明白Vec何时定义为

pub struct Vec<T> {
ptr: *mut T,
cap: usize,
len: usize,
}
并引用:

And indeed this would compile. Unfortunately, it would be incorrect. First, the compiler will give us too strict variance. So a &Vec<&'static str> couldn't be used where an &Vec<&'a str> was expected. More importantly, it will give incorrect ownership information to the drop checker, as it will conservatively assume we don't own any values of type T.


我已经尝试了下面的代码( Playground),但是它可以工作。
pub struct TestVec<T> {
raw: *mut T,
len: usize,
cap: usize,
}

impl<T> TestVec<T> {
pub fn new()->Self {
TestVec { raw: std::mem::MaybeUninit::uninit().as_mut_ptr(), len:0, cap:0}
}
}

fn test1(a: &TestVec<&str>) {
}

fn test() {
let v:TestVec<&'static str> = TestVec::new();
test1(&v);
}

fn main() {
test();
}
我哪里错了?还是有示例代码?

最佳答案

该声明是关于类型差异的,这是一个关于类型之间关系的棘手概念,实际上是一种特殊的子类型。
您的示例不包含方差。它应运而生:

fn test1<'x, 'y>(a: &'x TestVec<&'y str>)
当您使用 v: TestVec<&'static str>调用此函数时, 'x的生存期将解析为 v的生存期, 'y'static。这里没有类型差异,只有泛型。
但是考虑另一个需要变化的示例:
fn test2<'x>(a: &TestVec<&'x str>, b: &TestVec<&'x str>) {}

fn test_variance<'a>() {
let v1:TestVec<&'static str> = TestVec::new();
let v2:TestVec<&'a str> = TestVec::new();
test2(&v1, &v2);
}
现在,由于差异,编译器应将 'x作为 'a'static的最短生命期解决,应该只是 'a。但是 *mut T中的 TestVec导致此错误:
cannot infer an appropriate lifetime for lifetime parameter 'a in function call due to conflicting requirement
...
= note: expected `&TestVec<&str>`
found `&TestVec<&'static str>`
然后,如Nomicon所述,将 *mut T更改为 *const T使其可以再次工作。

关于rust - 为什么在需要&Vec <&'a str>的地方使用nomicon布局章节&Vec <&'static str> couldn'?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63259621/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com