C ++ 11 ввел новые категории значений, одна из них xvalue
,
это объяснил по Страуструпу как то так (im
категория): «это значение, которое имеет идентичность, но может быть перемещено из».
Другой источник,
cppreference объясняет:
glvalue — это выражение, оценка которого определяет идентичность объекта, битового поля или функции;
А также xvalue
это glvalue
так что это утверждение верно для xvalue
тоже.
Теперь я подумал, что если xvalue
есть личность, тогда я могу проверить, если два xvalue
s ссылаются на один и тот же объект, поэтому я беру адрес xvalue
, Как оказалось, не допускается
int main() {
int a;
int *b = &std::move(a); // NOT ALLOWED
}
Что это значит xvalue
есть личность?
У xvalue есть тождество, но в языке есть отдельное правило, что унарный &
-выражение требует операнд lvalue. От [expr.unary.op]:
Результат одинарный
&
Оператор является указателем на свой операнд. Операнд должен быть lvalue […]
Вы можете посмотреть на идентичность xvalue после выполнения преобразования rvalue в lvalue, связав xvalue со ссылкой:
int &&r = std::move(a);
int *p = &r; // OK
Других решений пока нет …