Apakah standar menentukan dengan tepat apa yang dapat saya lakukan dengan suatu objek setelah dipindahkan? Saya dulu berpikir bahwa semua yang dapat Anda lakukan dengan objek yang dipindahkan adalah melakukan perusakan, tetapi itu tidak akan cukup.
Misalnya, ambil templat fungsi swap
seperti yang didefinisikan di pustaka standar:
template <typename T>
void swap(T& a, T& b)
{
T c = std::move(a); // line 1
a = std::move(b); // line 2: assignment to moved-from object!
b = std::move(c); // line 3: assignment to moved-from object!
}
Jelas, harus mungkin untuk menetapkan objek-objek yang dipindahkan, jika tidak, baris 2 dan 3 akan gagal. Jadi apa lagi yang bisa saya lakukan dengan objek yang dipindahkan? Di mana tepatnya saya dapat menemukan detail ini dalam standar?
(Ngomong-ngomong, mengapa T c = std::move(a);
bukannya T c(std::move(a));
di baris 1?)
sumber
pop_back
pindah-darivector
. Tapi Anda tentu bisa mengetahuinyaempty()
.pop_back
dari yang kosongvector
memiliki perilaku yang tidak terdefinisi, dari memori, jadi saya cukup yakin bahwapop_back
dari vektor yang dipindahkan yang menunjukkan perilaku tidak terdefinisi adalah konsisten.pop_back
masih berperilaku seperti pada vektor yang valid (bahkan mungkin menjadi vektor kosong).17.6.5.15 [lib.types.movedfrom]
Ketika suatu objek dalam keadaan yang tidak ditentukan, Anda dapat melakukan operasi apa pun pada objek yang tidak memiliki prasyarat. Jika ada operasi dengan prasyarat yang ingin Anda lakukan, Anda tidak bisa langsung melakukan operasi itu karena Anda tidak tahu apakah keadaan objek yang tidak ditentukan memenuhi persyaratan.
Contoh operasi yang umumnya tidak memiliki prasyarat:
get
,empty
,size
Contoh operasi yang umumnya memiliki prasyarat:
Jawaban ini sekarang muncul dalam format video di sini: http://www.youtube.com/watch?v=vLinb2fgkHk&t=47m10s
sumber
char* buffer;
danint length;
anggota, maka konstruktor / tugas saya harus menukar (atau menetapkan) nilai keduanya? Atau akan baik-baik saja, jika panjangnya tidak ditentukan (artinyaempty
dansize
mengembalikan nilai yang tidak berarti)?