Это, кажется, самый встречный вопрос, который уже задан.std :: move Vs std :: forward
Whats the difference between std::move and std::forward
Но каждый ответ отличается и применяет и говорит немного разные вещи. Поэтому я смущен.
У меня есть следующая ситуация.
- Копировать элемент в контейнер
Копирование элемента является C++ 03, так что я понимаю, что очень хорошо. - Construct элемент в контейнер
Конструкцию элемента в контейнер я считаю, использует совершенную переадресацию правильно направить аргументы через две функции конструктору T вemplaceBackInternal()
(Скажите, пожалуйста, в противном случае, если я не прав). - Переместить товар в контейнер
Проблема, похоже, заключается в понимании перемещения предмета в контейнер.
Кодекс:
template<typename T>
class Container
{
std::size_t length;
T* buffer;
public:
void push_back(T const& value)
{
resizeIfRequired();
pushBackInternal(value);
}
template<typename... Args>
void emplace_back(Args&&... args)
{
resizeIfRequired();
emplaceBackInternal(std::forward<T>(arg)...);
}
void push_back(T&& value)
{
resizeIfRequired();
// Is this forward correct or should it be move
moveBackInternal(std::forward<T>(value));
}
private:
void pushBackInternal(T const& value)
{
// Copy construct object into buffer;
new (buffer + length) T(value);
++length;
}
template<typename... Args)
void emplaceBackInternal(Args&&... args)
{
// Construct object into buffer using arguments;
new (buffer + length) T(std::forward<T>(args)...);
++length;
}
void moveBackInternal(T&& value)
{
// Move construct object into buffer;
// Is this forward correct or should it be move
new (buffer + length) T(std::forward<T>(value));
++length;
}
};
я включаю все три здесь, чтобы сравнить три функции с ответами, представленными в ранее упомянутом ответе. Основная причина в том, что move
и construct
выглядят настолько похожими, что кажется, что они должны быть одинаковыми.
Answer @Potatoswatter Score 67
станд :: вперед имеет один случай использования: изгонять параметр
в шаблонных функций Согласно этому определению, я должен использовать std::move
внутри push_back(T&& value)
и moveBackInternal(T&& value)
как Значение не является параметром шаблона для функции.
Answer @Howard Hinnant Score 38
Если Y представляет собой ссылку-значение, то результат будет именующее выражением. Если Y не является ссылкой на lvalue, результатом будет выражение r12ue (значение xvalue to exact).
По этому определению я могу использовать либо std::move
, либо std::forward
.
станд :: вперед используется для передачи параметра, точно так, как он был передан в функцию.
Предполагается, что std::forward
является приемлемым (хотя, если я следую ссылке в ответе, все примеры используют шаблонные функции).
Er ... на ваш вопрос, на который не ответили связанные ответы? – Barry
Er ... какой ответ правильный !. Каждый из них указывает другой результат. –
Все они правильные. Двое просто говорят, что намерение 'std :: forward' предназначено для пересылки ссылок, а третий дополнительно тратит некоторое время на объяснение того, что такое' std :: forward'. – Barry