Действительно ли необходимо помещать std :: move внутри лямбды? - PullRequest
9 голосов
/ 15 декабря 2011

Действительно ли мне нужно инкапсулировать вызов std :: move в лямбду?

std::list<std::wstring>     srcData = GetData(); // implementation not important
std::vector<std::wstring>   dstData;
dstData.reserve(srcData.size());
std::transform(std::begin(srcData), std::end(srcData), std::back_inserter(dstData), 
    [](std::wstring& guid) -> std::wstring { return std::move(guid); });
srcData.clear();

Я все еще новичок в ссылках на лямбды и rvalue, поэтому сначала я попытался:

std::transform(std::begin(srcData), std::end(srcData), 
    std::back_inserter(dstData), &std::move<std::wstring>);

, который не работает.

Должен ли я поместить ход в лямбду или я упускаю что-то очевидное?

1 Ответ

13 голосов
/ 15 декабря 2011

Альтернативой является использование итераторов перемещения:

std::vector<std::wstring> dstData(std::make_move_iterator(srcData.begin()),
                                  std::make_move_iterator(srcData.end()));

Или используйте алгоритм move:

std::move(srcData.begin(), srcData.end(), std::back_inserter(dstData));

Так как его спросили, вот как можно заставить оригинальное предложение работать:

int main()
{
    std::transform(std::begin(srcData),
      std::end(srcData),
      std::back_inserter(dstData),
      static_cast<std::wstring&&(*)(std::wstring&)>(&std::move<std::wstring&>));
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...