Kendi yineleyicilerini kullanarak bir konteyner atamak güvenli mi?


10

Örnek olarak:

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

Yukarıdaki kodun davranışı tanımlanmış mı? Yoksa tanımsız davranışlara yol açar mı?

Yanıtlar:


5

Evet. Atamanın bu sürümü şu şekilde tanımlanır :

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

Kısıtlamalar : InputIterator, girdi yineleyici olarak nitelendirilen bir türdür.

Efektler : Eşdeğer: dönüş ataması (basic_string (ilk, son, get_allocator ()));

ki bu, değişiklikler yapılmadan önce geçici olarak hesaplananı gösterir.


"eşdeğeri", gerçek bir geçidin oluşturulması gerektiği anlamına gelmez. Anlambilimin aynı olması gerekir. Ve gösterilen sürüm kendi kendine atamaya karşı güvenli olduğundan, gerçek uygulama da olmalıdır.
MSalters

@MSalters. kabul. Bu konuda yorum yapmak istedim, sonra ne kadar ayırıcı kullanımının belirlenebileceğini belirlemeye çalışırken kayboldum.
AProgrammer

Bunun dizelere özgü olduğunu unutmayın. Diyelim ki vektörler için UB olurdu.
TC

@TC, standart teklif verebilir misiniz?
Adler

1
@Adler, vektör açıklamasının başvurduğu bu tabloya bakın .
AProgrammer
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.