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
T
disebut berapa kali sama dengan jumlah elemen terhapus, tetapi langkah operator penugasan dariT
disebut 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::vector
itu disebutkan secara eksplisit bahwa operator penugasan pindah dipanggil.
Ada juga persyaratan untuk T
menjadi MoveAssignable
agar erase()
dapat bekerja dengan keduanya std::vector
dan 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 .