为什么提升python调用复制构造函数?

时间:2016-08-04 02:05:08

标签: python boost boost-python

假设提供了一个包装类

class Example
{
public:
    Example()
    {
        std::cout << "hello\n";
    }
    Example(const Example& e)
    {
        std::cout << "copy\n";
        counter++;
    }
    ~Example()
    {
        std::cout << "bye\n";
    }
    Example& count()
    {
        std::cout << "Count: " << counter << std::endl;
        return *this;
    }
    static int counter;
};
int Example::counter = 0;

使用

暴露给python
using namespace boost::python;
class_<Example>("Example", init<>())
        .def("count", &Example::count, return_value_policy<copy_non_const_reference>());

现在如果我执行以下python代码

obj=Example()
obj.count().count()

我得到了

hello
Count: 0
copy
Count: 1
copy
bye

这意味着boost python正在使用复制构造函数。

我的问题:

  1. 为什么要调用复制构造函数?
  2. 如果我使用boost :: noncopyable,则不会调用复制构造函数。但是,在这种情况下,我无法执行我的python代码,因为它抱怨to_python转换器(见下文)。有办法解决这个问题吗?

    TypeError:找不到C ++类型的to_python(by-value)转换器:class Example

1 个答案:

答案 0 :(得分:2)

调用复制构造函数是因为return_value_policy<copy_non_const_reference>()正在设置boost docs

  

copy_non_const_reference是ResultConverterGenerator的模型   可以用来包装返回引用到非const的C ++函数   输入类型,以便将引用的值复制到新的Python中   对象

它会抱怨,因为需要复制返回值,但同时类为noncopyable,因此找不到默认转换器。

要解决此问题,请使用return_value_policy<copy_non_const_reference>()或定义自定义to_python转换器。