Подтвердить что ты не робот

Функция dual to 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));
    ...
  }
}

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

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

4b9b3361

Ответ 1

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

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

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

Ответ 2

Нетрудно написать:

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

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

Ответ 3

Если вы можете манипулировать 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&) переадресацией на конструктор копирования B и A(B&&) пересылки на конструктор перемещения B.