1

有没有办法使用移动语义包装返回对象(值不是指针或引用)而不复制对象的 C++ 函数?

例子:

我有一个函数创建一个大对象 A 并使用它的移动构造函数返回它:

class A {
public:
  A( A&& );
};

A createA() 
{
  // creates A here
  return std::move(A);
}

在 C++ 中,我可以通过将 A 从函数中“移出”来避免复制它。现在,我需要使用 boost python 在 Python 中包装 A 和 createA。据我所知,当函数返回一个对象时,boost python 会自动调用 A 的复制构造函数。如果我不为 A 提供复制构造函数,编译将失败。我的问题是是否有办法在不复制的情况下将对象“移动”到 Python 世界中。

4

2 回答 2

3

以下代码应该可以工作

struct A
{
  A() = default;
  A(A&&) = default;
};

A createA()
{
  return {};
}

using bp = boost::python;


bp::class_<A, boost::noncopyable, std:: shared_ptr<A>> (
  "A", "noncopyable class A", bp::no_init);

bp::def(
  "createA",
  +[]()
  {
    return std::make_shared<A> (createA()); 
  });
于 2016-04-21T17:51:06.653 回答
0

您可能正在尝试将值返回给新函数。例如:

def get_three():
    value = 3
    return value

def square(x):
    square = x * x
    return square

print square(get_three())

>> 9

您不必临时设置 get_three 的值,如下所示:

three = get_three()
print square(three)

你可以直接传入函数。

于 2013-09-28T04:01:17.487 回答