【发布时间】:2015-07-14 01:41:39
【问题描述】:
PhantomData 与 Copy 的交互方式令人惊讶:
use std::marker::PhantomData;
#[derive(Copy, Clone)]
pub struct Seconds;
pub struct Meters;
#[derive(Copy, Clone)]
pub struct Val<T> {
pub v: PhantomData<T>
}
fn main() {
let v1: Val<Seconds> = Val {v: PhantomData};
let v2 = v1;
let v3 = v1;
let v4: Val<Meters> = Val {v: PhantomData};
let v5 = v4;
let v6 = v4;
}
失败如下:
src/main.rs:20:13: 20:15 error: use of moved value: `v4` [E0382]
src/main.rs:20 let v6 = v4;
^~
src/main.rs:19:13: 19:15 note: `v4` moved here because it has type `Val<Meters>`, which is moved by default
src/main.rs:19 let v5 = v4;
我认为将Copy 派生为Val<Meters> 会给出Val<Meters> 复制语义。但显然,只有在Val 的类型参数T 也实现Copy 的情况下,这才是正确的。我不明白为什么。
PhantomData 始终实现Copy、regardless of whether its type parameter does。无论如何,如果PhantomData<Meters> 没有实现Copy,我希望编译器会抱怨它无法为Val<Meters> 派生Copy。相反,编译器很乐意为Val<Meters> 派生Copy,但它应用了移动语义。
这种行为是故意的吗?如果有,为什么?
【问题讨论】:
标签: rust