是否可以显式标记具有未实现Send或Sync标记特征的类型,而不需要一些冗余字段?这可以是一个替代方案:
struct T {
_marker: PhantomData<*const ()>,
}
Run Code Online (Sandbox Code Playgroud)
但同样,它有一个冗余字段,非常神秘(您需要记住指针是!Send + !Sync),并且获得正确的组合可能并不简单(考虑!Sync + Send)。我相信负面特质可能是一个解决方案,但它们尚未稳定可用:
// error[E0658]: negative trait bounds are not yet fully implemented
impl !Send for T {}
Run Code Online (Sandbox Code Playgroud)
Luc*_*iel 11
您的PhantomData解决方案通常就是执行此操作的方法。我有点惊讶地发现没有PhantomUnsendorPhantomUnsync类型std::marker,就像有PhantomPinned;一样。我的建议是在模块中添加util.rs类似的内容:
pub type PhantomUnsync = PhantomData<Cell<()>>;
pub type PhantomUnsend = PhantomData<MutexGuard<'static, ()>>;
Run Code Online (Sandbox Code Playgroud)
这些 typedef 清楚地表明它们的存在是为了强制!Send或!Sync包含它们的类型,就像PhantomPinned强制一样!Unpin。