Функция двойная к std::move?

Давайте предположим, что у меня есть класс только с одним конструктором:

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));
    ...
  }
}

Есть ли какая-либо функция "двойная" для std::move в C++11 или C++14, что заменит make_a_copy выше?

Изменить: некоторые разъяснения.

3 ответа

Почему ты не можешь просто скопировать BigClass объект?

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

Это делает временный BigClass затем перемещается в T

Не сложно написать

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

Может существовать стандартная функция, которая делает это случайно при вызове с одним аргументом, но не существует такой, предназначенной для этого необычного шаблона.

Если вы можете манипулировать 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;
}

Печать

Б переехал (3)
B скопировано (4)

Насколько я понимаю, сворачивание ссылок вы должны получить конструктор A(B&) пересылка в конструктор копирования B и A(B&&) пересылка конструктору перемещения B,

Другие вопросы по тегам