如何为类型实现 !Send 或 !Sync?

Kit*_*tsu 14 rust

是否可以显式标记具有未实现SendSync标记特征的类型,而不需要一些冗余字段?这可以是一个替代方案:

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