具有相同原型但身体不同的限制模板参数,将锈相编译器算作不同类型的单态?

问题描述 投票:0回答:2
锈。对于这样的东西(一个闭合作为参数的函数):

pub fn copy_checked<R1, R2>(&'sdl mut self, path: &str, src: R1, dst: R2) -> Result<(), String> where R1: Into<Option<Rect>>, R2: Into<Option<Rect>>, { RenderSystem::get_or_load_and_use( // closure arg here |txt: &Texture<'_>| self.cc.canvas.copy(&txt, src, dst), ) }
上述失败,因为R1和R2也需要复制特征。

cannot move out of `dst`, a captured variable in an `FnMut` closure move occurs because `dst` has type `R2`, which does not implement the `Copy` trait

这使我不确定如何确切地实现生锈模板。如果就像C ++,那么不需要复制ARGS。该函数只会被列入编译。但是,如果它在执行副本,则意味着具有相同签名(ARGS和返回类型)的不同lambdas不需要具有不同的编译实例。他们可以具有相同的功能主体,但只使用了不同的功能指针。
中摘要:是否具有相同原型(ARGS和返回类型)的闭合模板参数,但不同的身体算作不同类型的生物构造?

	

从关闭中的参考

闭合表达式产生一个闭合值,具有独特的匿名类型,无法写出

templates rust closures
2个回答
0
投票
闭合,无论它是什么签名,都有不同的类型。

您的问题涉及许多相互关联的事物:

1。)每个闭合定义即使具有相同的签名也会创建
式匿名类型。

2。)RUST编译器确实使用单态化来编译仿制药 - 这意味着调用具有不同闭合的函数将为通过

3。)Rust不会等到单态化返回错误。实际上,目标是在单形化时间没有错误。取而代之的是,所有约束都必须在所有情况下必须保留。这是C ++模板和Rust Generics之间最大的不同。
因此,即使您通过类型为

R1R2


0
投票
因此,功能主体不会通过约束求解器。

约束不是由于单态化(或缺乏),而是所有权问题。您正在将

R1R2

通过价值传递到

Copy

中,这意味着您在传递后失去了所有权。但是错误表明传递给

Copy

src

的闭合 - 可以多次称为
dst
,因此可以多次调用。您可以多次传递某事的所有权的唯一方法是实现
.copy。因此,要进行编译,您需要添加一个约束,即get_or_load_and_use
FnMut
.copy
Copy


或如果太过限制。相反,您可以限制

R1

,然后将克隆传递到
R2
Copy
请参阅复制和克隆之间的区别?

    
	
最新问题
© www.soinside.com 2019 - 2025. All rights reserved.