Чи безпечно призначити контейнер за допомогою власних ітераторів?


10

Як приклад:

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

Чи визначено поведінку вищевказаного коду? Або це призводить до невизначеної поведінки?

Відповіді:


5

Так. Ця версія призначення визначена як

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

Обмеження : InputIterator - це тип, який кваліфікується як ітератор введення.

Ефекти : еквівалент: присвоєння повернення (basic_string (перший, останній, get_allocator ()));

який показує тимчасові обчислення до того, як відбудуться зміни.


"еквівалент" не означає, що необхідно створити фактичний тимчасовий. Однак семантика повинна бути однаковою. А оскільки показана версія є захищеною від самопризначення, реальна реалізація повинна бути занадто великою.
MSalters

@MSalters. домовились. Я мав намір прокоментувати це, що потім загубився, намагаючись визначити, яка частина використання алокатора може бути ухилена.
AProgrammer

Зауважте, що це властиво рядкам. Бо, скажімо, вектори, це був би UB.
ТК

@TC, ти міг би процитувати стандарт?
Адлер

1
@Adler, див. Цю таблицю, на яку посилається векторний опис.
AProgrammer
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.