Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/xml/15.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 接受右值引用作为参数的方法的Swig行为_Java_C++_Swig_Move Semantics_Rvalue Reference - Fatal编程技术网

Java 接受右值引用作为参数的方法的Swig行为

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

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 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?)中,您可能会试图使用这样一个事实,即您的对象是对您有利的引用,并且(对这些语言来说是透明的)编写一个类型映射,如果我们是唯一仍然持有对象引用的人,则根据该重载选择要使用的类型。我认为即使这种情况也是错误的(也是过早的优化),因为:

  • 如果语言支持这样的构造,那么弱引用周围就存在竞争条件。这是很难发现和避免的
  • >P>即使您对Python对象只有一个引用,仍然可以有多个引用到同一C++对象,例如:

    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()