Ответ 1
Почему вы не можете просто скопировать объект BigClass
?
void foo(const BigClass& big) {
while (...) {
T t{ BigClass(big) };
...
}
}
Это создает временный BigClass
, который затем перемещается в T
Предположим, что у меня есть класс с одним конструктором:
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 выше?
Изменить: некоторые пояснения.
Почему вы не можете просто скопировать объект 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;
}
Печать
B переехал (3)
B скопировано (4)
Насколько я понимаю, обращение коллапсирования ссылок должно сопровождаться конструктором A(B&)
переадресацией на конструктор копирования B
и A(B&&)
пересылки на конструктор перемещения B
.