Тема: std::move<T>(T &&). Як правильно його використовувати ? + const_cast
Думав що знаю C++, виявилось нічого я не знаю, принаймні не C++11.
[Конструктори і оператори] [копіювання і переміщення] наче освоїв, але є проблема з розумінням функції std::move. Я не знаю як вона працює і де потрібно її використовувати.
На stackoverflow читав, що std::move взагалі не функція, а якась спеціальна штука для компілятора. Перечитав купу інфи з різних джерел, почерпнув різні приклади його застосування (де його можна писати в коді), але це не прибавило розуміння того, де він необхідний, а де зайвий.
Хочу розглянути його на конкретному прикладі:
// Node.h
#ifndef NODE_H
#define NODE_H
template<typename T>
struct Node
{
private:
Node<T> *Next;
public:
T Data;
virtual Node<T> *GetNext() { return Next; }
virtual void SetNext(Node<T> *const next) { Next = next; }
Node() : Data(), Next(NULL) { }
Node(T const &data) : Data(data), Next(NULL) { }
Node(T const &data, Node<T> *const next) : Data(data), Next(next) { }
Node(Node<T> const &lvalue) : Data(lvalue.Data), Next(lvalue.Next) { }
// рядки, по яких є питання:
Node(T &&data) : Data(std::move(data)), Next(NULL) { }
Node(Node<T> &&rvalue) : Data(std::move<T &>(rvalue.Data)),
Next(rvalue.Next == &rvalue ? this : std::move<Node<T> *&>(rvalue.Next)) { }
virtual ~Node() { Next = NULL; }
// VS2008 does not support rvalue references (&&).
};
#endif // end for #ifndef NODE_H.
Чи добре таке використання std::move в рядках 23-25 ?
Чи варто явно вказувати типи-параметри функції std::move ?
Які є переваги або недоліки у такому коді в порівнянні з наступним ?
Node(T &&data) : Data(data), Next(NULL) { }
Node(Node<T> &&rvalue) : Data(rvalue.Data),
Next(rvalue.Next == &rvalue ? this : rvalue.Next) { }
Буду радий будь-якій корисній інформації, яка стосується std::move, std::forward і їм подібних.
Також можете наводити свої приклади.