3

假设我有一个只有一个构造函数的类:

class T {
 public:
  T(BigClass&& big) : big(std::move(big)) {}
  ...

  SomeBigClass
};

在大多数地方,构造函数是在临时对象上调用的,但在一个地方我需要制作 BigClass 的显式副本,因为它不是临时的,并且将在循环中多次使用:

void foo(const BigClass& big) {
  while (...) {
    T t(std::make_a_copy(big));
    ...
  }
}

在 C++11 或 C++14 中是否有任何“双重”函数std::move可以取代上面的 make_a_copy ?

编辑:一些澄清。

4

3 回答 3

6

为什么不能只复制BigClass对象?

void foo(const BigClass& big) {
  while (...) {
    T t{ BigClass(big) };
    ...
  }
}

这使得一个临时BigClass的,然后被移动到T

于 2013-07-06T00:15:01.633 回答
1

不难写:

template <typename T>
T make_temp(const T& x) { return x; }

可能有一个标准函数在使用一个参数调用时碰巧做到了这一点,但没有为这种不寻常的模式设计的函数。

于 2013-07-07T00:50:46.920 回答
-1

如果你可以操纵T你可以模板构造函数。

#include <iostream>
using namespace std;
class B
{
  int x;
public:
  B (int i) : x(i) { }
  B (B && b) : x(b.x) { cout << "B moved (" << x << ")" << endl; }
  B (B const  & b) : x(b.x)  { cout << "B copied (" << x << ")" << endl; }
};


class A
{
  B b;
public:
  template<typename TB>
  A (TB && init_b) : b(std::forward<TB &&>(init_b)) { }
};

B foo (void) { B x(3); return x; }


int main (void)
{
  A a1(foo());
  B b1(4);
  A a2(b1);
  return 0;
}

印刷

B 移动 (3)
B 复制 (4)

据我了解参考折叠你应该拿出一个构造函数A(B&)转发到复制构造函数BA(B&&)转发到移动构造函数B

于 2013-07-05T23:05:10.750 回答