作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
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.
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/
我是一名优秀的程序员,十分优秀!