Salin / pindahkan tugas di std :: vector :: erase () dan std :: deque :: erase ()

135

Dalam proses menjawab pertanyaan lain saya menemukan kata-kata yang sedikit berbeda untuk std::vector::erase()dan std::deque::erase().

Inilah yang C ++ 14 katakan tentang std::deque::erase( [deque.modifiers]/4-6, penekanan dari saya):

Efek: ...

Kompleksitas: Jumlah panggilan ke destruktor sama dengan jumlah elemen yang dihapus, tetapi Jumlah panggilan ke operator penugasan tidak lebih dari jumlah yang lebih sedikit dari jumlah elemen Sebelum elemen terhapus dan jumlah elemen setelah elemen terhapus.

Throws: Tidak ada kecuali pengecualian dilempar oleh copy konstruktor, memindahkan konstruktor, operator penugasan, atau operator penugasan pindah T.

Dan inilah yang dikatakannya tentang std::vector::erase( [vector.modifiers]/3-5):

Efek: ...

Kompleksitas: The destructor dari Tdisebut berapa kali sama dengan jumlah elemen terhapus, tetapi langkah operator penugasan dari Tdisebut berapa kali sama dengan jumlah elemen dalam vektor setelah unsur-unsur terhapus.

Throws: Tidak ada kecuali pengecualian dilempar oleh copy konstruktor, memindahkan konstruktor, operator penugasan, atau operator penugasan pindah T.

Seperti yang Anda lihat, spesifikasi pengecualian untuk keduanya sama, tetapi untuk std::vectoritu disebutkan secara eksplisit bahwa operator penugasan pindah dipanggil.

Ada juga persyaratan untuk Tmenjadi MoveAssignableagar erase()dapat bekerja dengan keduanya std::vectordan std::deque(Tabel 100), tetapi ini tidak menyiratkan adanya operator penugasan pindah: seseorang dapat menentukan operator penugasan salinan, dan tidak menentukan operator penugasan pindahan, dan kelas ini akan menjadi MoveAssignable.

Untuk berjaga-jaga, saya memeriksa dengan GCC dan Clang, dan memang std::vector::erase()memanggil operator penugasan salinan jika tidak ada operator penugasan pindah, dan std::deque::erase()melakukan hal yang sama ( DEMO ).

Jadi pertanyaannya adalah: apakah saya melewatkan sesuatu, atau ini adalah masalah (editorial) dalam standar?

Pembaruan: Saya telah mengirimkan masalah LWG # 2477 .

Anton Savin
sumber
14
Sepertinya ada cacat dalam standar.
Barry
4
^ ack. Masalah POKJA akan sesuai.
Columbo
4
Biasanya standar draf sudah cukup baik. Ini adalah salah satu kasus di mana Anda harus melihat hal yang nyata.
Markus Ransom
3
@MarkRansom sumber saat ini dari standar untuk std :: deque dan std :: vector sama seperti dalam pertanyaan, jadi kemungkinan bahwa versi final berbeda sangat kecil.
Anton Savin
3
N4141 memiliki susunan kata yang sama dengan N4140.
Brian

Jawaban:

9

Pada pertemuan Lenexa, masalah tersebut mendapat status segera dengan resolusi yang diusulkan:

Kata-kata ini relatif terhadap N4296.

Ubah 23.3.3.4 [deque.modifiers] / 5 menjadi:

-5- Kompleksitas : Jumlah panggilan ke destructor dariT sama dengan jumlah elemen terhapus, namun jumlah panggilan ke operator penugasan dariT tidak lebih dari yang lebih rendah dari jumlah elemen sebelum elemen terhapus dan jumlah elemen setelah elemen terhapus.

Ubah 23.3.6.5 [vector.modifiers] / 4 menjadi:

-4- Kompleksitas : Penghancur Tdisebut jumlah kali sama dengan jumlah elemen yang dihapus, tetapi operator penugasan bergerakT disebut jumlah kali sama dengan jumlah elemen dalam vektor setelah elemen yang dihapus.

Artinya, jika resolusi diterima tidak akan ada penyebutan khusus pemindahan tugas std::vector::erase, dan kata-kata untuk std::deque::eraseakan sedikit diperjelas.

Anton Savin
sumber