std::move() и xvalue в C++

Может кто-нибудь дать мне "ациклическое" определение / объяснение поведения xvalue и std:: move ()?

Я посмотрел на страницу cppreference, и там написано, что "std:: move () создает xvalue". (Хорошо)

Затем я искал определение "xvalue" и первое, что он говорит, это вызов функции или перегруженное выражение оператора, такое как "std: move". (???)

2 ответа

std::move() преобразует выражение из lvalue или rvalue в xvalue.

Lvalue - это объект, занимающий некоторое место в памяти, тогда как rvalue временно занимает память.

int main() {  
   int x = 3 + 4;  
   std::cout << x << std::endl;
}

В приведенном выше примере x это lvalue и 3 + 4 это значение. Теперь посмотрим x не временно 3 + 4 Выражение является временным значением.

Теперь рассмотрим, что вы делаете это: int y = x;, У вас есть две копии этого x в памяти верно?

Проверьте пример ниже:

swap(int &a, int &b) {
    int tmp = a;   // Two copies of a; one of them is tmp
    a = b;      // Two copies of b; one of them is a
    b = tmp;    // Two copies of tmp; one of them is b
}

Проверьте приведенный ниже пример, используя std::move():

swap(int &a, int &b) {
    int tmp = std::move(a); // tmp is an xvalue
    a = std::move(b);   
    b = std::move(tmp);
}

Вы не копируете; Вы перемещаете их куда-нибудь вместо этого. На самом деле, вы передаете содержание этого в течение некоторого времени. Они скоро будут уничтожены. Они сейчас xvalue с:)

В этом предложении нет циклического определения.

Следующие выражения являются выражениями xvalue:

вызов функции или перегруженное выражение оператора, тип возвращаемого значения которого является rvalue ссылкой на объект, такой как std:: move (x);

...

Вот std::move это всего лишь пример, суть в том, что "тип возвращаемого значения - ссылка на значение". Поскольку функция, возвращающая ссылку на rvalue, не очень обычна, в то время как std::move нацелен на то, чтобы служить хорошим примером. Это подпись std::move:

template< class T >
constexpr typename std::remove_reference<T>::type&& move( T&& t ) noexcept;

чье возвращаемое значение должно быть ссылкой на rvalue.

Другие вопросы по тегам