Reference 如何将引用的元组转换为元组的引用?
我想将引用的元组(都是对同一结构的成员的引用)转换为元组的引用 我试着用各种方式强迫他们,但是没有克隆我是做不到的Reference 如何将引用的元组转换为元组的引用?,reference,rust,Reference,Rust,我想将引用的元组(都是对同一结构的成员的引用)转换为元组的引用 我试着用各种方式强迫他们,但是没有克隆我是做不到的 structbar(); 结构Foo(Bar,Bar,Bar); fn main(){ 设a:&Foo=&Foo(Bar(),Bar(),Bar()); 设b:&(Bar,Bar)=&(a.0,a.1); } 错误[E0507]:无法移出借用的内容 -->src/main.rs:7:28 | 7 |设b:&(Bar,Bar)=&(a.0,a.1); |^^^无法移出借用的内容 错
structbar();
结构Foo(Bar,Bar,Bar);
fn main(){
设a:&Foo=&Foo(Bar(),Bar(),Bar());
设b:&(Bar,Bar)=&(a.0,a.1);
}
错误[E0507]:无法移出借用的内容
-->src/main.rs:7:28
|
7 |设b:&(Bar,Bar)=&(a.0,a.1);
|^^^无法移出借用的内容
错误[E0507]:无法移出借用的内容
-->src/main.rs:7:33
|
7 |设b:&(Bar,Bar)=&(a.0,a.1);
|^^^无法移出借用的内容
我希望b
属于类型和(条形,条形)
给定a
属于&Foo类型这是不可能的
引用引用一个值。您希望有一个&(Bar,Bar)
,但内存中没有一个地方有(Bar,Bar)
的两元组。你不能引用不存在的东西
&(A,B)
和(&A,B)
的内存布局基本上是不兼容的,因此也不能使用不安全的防锈技术
在这种特殊情况下,可能会使用不安全的锈迹将&Foo
直接转换为&(条形,条形)
,但是
- 它要求元组结构和元组的布局相同;我不知道这是可以保证的
- 它要求对元组结构的布局进行紧密打包,这样就可以通过成员大小进行偏移,从而到达下一个元组结构;我不知道这是可以保证的
- 它要求元组结构的布局按照定义的顺序放置成员;我不知道这是可以保证的
- 您只能对连续的片段执行此操作;没有得到第一和第三项
1——事实上:
元组对其布局没有任何保证
例外情况是单位元组(()
),它保证为零大小类型,大小为0,对齐方式为1
这意味着,虽然此代码可能会打印出您期望的内容,而Miri不会抱怨,但这是未定义的行为。这是不可能的
引用引用一个值。您希望有一个&(Bar,Bar)
,但内存中没有一个地方有(Bar,Bar)
的两元组。你不能引用不存在的东西
&(A,B)
和(&A,B)
的内存布局基本上是不兼容的,因此也不能使用不安全的防锈技术
在这种特殊情况下,可能会使用不安全的锈迹将&Foo
直接转换为&(条形,条形)
,但是
- 它要求元组结构和元组的布局相同;我不知道这是可以保证的
- 它要求对元组结构的布局进行紧密打包,这样就可以通过成员大小进行偏移,从而到达下一个元组结构;我不知道这是可以保证的
- 它要求元组结构的布局按照定义的顺序放置成员;我不知道这是可以保证的
- 您只能对连续的片段执行此操作;没有得到第一和第三项
1——事实上:
元组对其布局没有任何保证
例外情况是单位元组(()
),它保证为零大小类型,大小为0,对齐方式为1
这意味着,虽然此代码可能会打印出您期望的内容,而Miri不会抱怨,但这是一种未定义的行为。您很可能正在经历错误。几乎可以肯定的是,有一种更好的方法可以解决导致您提出此问题的根本问题。您很可能正在经历一场灾难。几乎可以肯定,有一种更好的方法可以解决导致您提出此问题的根本问题。
// I copied this unsafe block from Stack Overflow
// without properly documenting why I think this code is safe.
let b: &(Bar, Bar) = unsafe { &*(a as *const Foo as *const (Bar, Bar)) };
println!("{:?}", b);
// I copied this unsafe block from Stack Overflow
// without properly documenting why I think this code is safe.
let c: &(Bar, Bar) = unsafe {
let p = a as *const Foo as *const Bar;
let p = p.offset(1);
&*(p as *const (Bar, Bar))
};
println!("{:?}", c);