Сначала коротко для тех, кто произносит C++ как «Си с классами»
- An lvalue - привязка value к функции или объекту. (Например: если E - это pointer type expression, тогда *E - это lvalue экспрешшен, забинденный на объект или функцию, куда указывает E. Другой пример: результат вызова функции, тип результата(return_type) которой lvalue reference - это lvalue.)
- xvalue (x значит что угодно больной фантазии) биндится к объекту, обычно в конце его жизни (так что ресурсы могут поехать (move), например). xvalue - результат определенных типов экспрешшенов, в которых есть rvalue references. (Например, результат вызова функции, тип результата которой rvalue reference - это xvalue).
- glvalue («generalized» lvalue) == lvalue | xvalue.
- rvalue - xvalue, временный объект или подобъект, или значение, не ассоциированное с объектом.
- prvalue («pure» rvalue) - rvalue, такое что не xvalue. (Например, результат вызова фунции, чей тип результата не reference – это prvalue)
А теперь вопрос. Что это все значит, мать его?
Какой практический смысл имеет выделение glvalue и prvalue?
Объясните в каких местах правильно и кошерно использовать rvalue references (которые ref&&)?
Олсо, поясните за поехавшую семантику (move semantics) и семантику копирования. Вот что такое поехавшая семантика, если простыми словами? А то я втыкаю в стандарт, что отдельные слова значат - вроде понятно, а как объяснить это одной фразой? Как это юзать? Вы реально юзаете копи-конструкторы?
Короче, какие есть хорошие практики на эту тему. Как это заюзать, чтобы не получилось как на картинке: http://i.imgur.com/jmBUEjr.png