Java 接受右值引用作为参数的方法的Swig行为
Swig文档指定它有意忽略移动构造函数。但是,它没有指定如何处理接受rvlaue引用的方法,例如:Java 接受右值引用作为参数的方法的Swig行为,java,c++,swig,move-semantics,rvalue-reference,Java,C++,Swig,Move Semantics,Rvalue Reference,Swig文档指定它有意忽略移动构造函数。但是,它没有指定如何处理接受rvlaue引用的方法,例如: class AAA { public: AAA() {}; // generates java code AAA(const AAA& a) {}; // generates java code AAA(AAA&& a) {}; // ignored by swig, no java code generated virtual void m
class AAA {
public:
AAA() {}; // generates java code
AAA(const AAA& a) {}; // generates java code
AAA(AAA&& a) {}; // ignored by swig, no java code generated
virtual void move(const std::string& str); // generates java code
virtual void move(std::string&& str); // also generates java code, but accepts SWIGTYPE_p_std__string as a parameter instead of String
};
这些方法会有不同的表现吗?在swig中是否有处理右值参数的方法?或者,我应该不使用它们吗?< P>一般来说,对于编写良好的C++代码,您可能期望两个重载函数或构造函数的行为是等价的,警告指出,RValor引用变量很可能对其输入具有破坏性。 因此,对于用另一种语言创建接口,它可能没有任何精确的1:1映射到右值试图表达的概念,那么绝大多数情况下,正确的答案就是忽略这些重载。在某些情况下,SWIG生成的包装器可能会在内部使用这些重载,或者您可以编写一些代码来实现这一点,但这只是一种优化。如果您正在跨越JNI边界,那么这可能不太可能成为您最大的性能瓶颈。(在做任何事情之前,先测量一下以确定是否正确) 在某些语言(例如Python、Lua?)中,您可能会试图使用这样一个事实,即您的对象是对您有利的引用,并且(对这些语言来说是透明的)编写一个类型映射,如果我们是唯一仍然持有对象引用的人,则根据该重载选择要使用的类型。我认为即使这种情况也是错误的(也是过早的优化),因为:
struct a {};
a& blah() {
static a a;
return a;
}
与
a、b和c都只有一个参考,但移动它们显然是错误的。而且几乎不可能证明它什么时候是安全的
所以我想说的是:除非你别无选择,否则就忽略它们。有时,您可能会遇到这样的情况:唯一的选择是调用接受右值引用的函数。您可以包装这些函数,但需要根据具体情况进行包装,因为您需要了解包装的函数/构造函数的语义。SWIG生成一个二进制接口,因此不可能使用r值引用的好处,它将始终衰减为按值引用,包装的代码应该显示这一点。
import test
a=test.blah()
b=test.blah()
c=test.blah()