Предположим, у меня есть класс только с одним конструктором:
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
в С++ 11 или С++ 14, которая заменит make_a_copy выше?
Изменить: некоторые пояснения.
T(BigClass const & big)
, а затем вместо этого вызвать его? - person cdhowie   schedule 06.07.2013swap
. Конструктор перемещения, присваивание копирования и присваивание перемещения можно записать в терминах конструктора копирования и свопинга. Без конструктора копирования... без ярлыков. - person Mooing Duck   schedule 06.07.2013std::move
потребуется в ситуации, когда у вас есть выражение ссылки rvalue и вам нужна модифицируемая ссылка lvalue (которая не будет привязана, если вы напишете ее таким образом, и создайте временную из rvalue тоже не будет работать, потому что он может инициализировать только ссылкиconst
lvalue). Здесь это не так, у вас прямо противоположная ситуация; его можно было бы скомпилировать с помощьюstd::move
, но это не делает того, что вы хотите. Решение состоит в том, чтобы сначала скопировать значениеbig
, которое не связано с вашимclass T
. - person Marc van Leeuwen   schedule 21.07.2014foo(const BigClass&)
(const ref!) конструктор перемещения уже будет не вызываться, так как вы не можете выйти из константного объекта. - person Martin Ba   schedule 19.11.2014