Apakah aman untuk menetapkan wadah menggunakan iteratornya sendiri?

10

Sebagai contoh:

string s = "123";
s.assign(find(s.begin(),s.end(),'2'), s.end());

Apakah perilaku kode di atas didefinisikan? Atau itu mengarah pada perilaku yang tidak terdefinisi?

Artavo
sumber

Jawaban:

5

Iya. Versi penetapan ini didefinisikan sebagai

template<class InputIterator>
  constexpr basic_string& assign(InputIterator first, InputIterator last);

Batasan : InputIterator adalah jenis yang memenuhi syarat sebagai input iterator.

Efek : Setara dengan: mengembalikan assign (basic_string (pertama, terakhir, get_allocator ()));

yang menunjukkan penghitungan sementara sebelum perubahan terjadi.

Pemrogram
sumber
"setara dengan" tidak berarti bahwa sementara yang sebenarnya harus dibuat. Tapi semantiknya harus sama. Dan karena versi yang ditampilkan aman terhadap penugasan diri, implementasi sebenarnya juga harus.
MSalters
@Malters. sepakat. Saya berniat mengomentari hal itu kemudian tersesat dalam mencoba menentukan berapa banyak penggunaan pengalokasi dapat dihilangkan.
Pemrogram
Perhatikan bahwa ini khusus untuk string. Untuk, katakanlah, vektor, itu adalah UB.
TC
@TC, bisakah Anda mengutip standar?
Adler
1
@Adler, lihat tabel ini yang merujuk deskripsi vektor.
Pemrogram