Rumah  >  Artikel  >  pembangunan bahagian belakang  >  Adakah Tugasan Pergerakan Sendiri Mungkin dengan Parameter Rujukan Rvalue dalam C 11?

Adakah Tugasan Pergerakan Sendiri Mungkin dengan Parameter Rujukan Rvalue dalam C 11?

Mary-Kate Olsen
Mary-Kate Olsenasal
2024-11-10 13:52:02632semak imbas

Is Self Move Assignment Possible with Rvalue Reference Parameters in C  11?

Tugasan Pergerakan Diri dan Perpustakaan Standard

Dalam C 11, perpustakaan standard menyediakan jaminan tertentu berkenaan tugasan bergerak sendiri. Mengikut piawaian, jika argumen fungsi terikat pada parameter rujukan nilai, pelaksanaan boleh menganggap bahawa parameter itu adalah rujukan unik kepada hujah tersebut.

Pertimbangkan fungsi berikut:

template<class T>
std::vector<T> selfAssign(std::vector<T> v) {
  v = std::move(v);
  return v;
}

Memandangkan hujah vektor terikat pada parameter rujukan rvalue, pelaksanaan std::vector::operator=(vector&& other) boleh menganggap yang lain ialah prvalue. Akibatnya, penugasan gerak kendiri tidak boleh dilakukan untuk v dalam fungsi tugasan sendiri.

Piawaian menentukan bahawa parameter rujukan rnilai boleh diandaikan sebagai nilai, sekali gus menghalang kemungkinan penugasan bergerak sendiri dalam kes sebegini. Besar kemungkinan vektor yang dihantar kepada fungsi selfAssign akan dibiarkan dalam keadaan tanpa sumber atau menjalani larangan jika ia sudah mempunyai kapasiti 0.

Walau bagaimanapun, draf kerja terkini bagi standard, N4618 , mengubah sedikit keperluan ini. Secara khusus, ia menyatakan bahawa, jika t dan rv tidak merujuk kepada objek yang sama, maka selepas tugasan 't = rv', t mungkin hanya perlu mengandungi nilai setara rv sebelum tugasan. Walau apa pun, keadaan rv kekal tidak dinyatakan selepas tugasan.

Atas ialah kandungan terperinci Adakah Tugasan Pergerakan Sendiri Mungkin dengan Parameter Rujukan Rvalue dalam C 11?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan:
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn