Это - недопустимое право?

Для персонального проекта я реализовывал свой собственный libstdc ++. Поразрядно, я делал некоторые хорошие успехи. Обычно, я буду использовать примеры из http://www.cplusplus.com/reference/ для некоторых случаев базового теста, чтобы удостовериться, что у меня есть очевидная функциональность, работающая как ожидалось.

Сегодня я столкнулся с проблемой с std::basic_string::replace, конкретно с основанными на итераторе версиями с помощью примера, скопированного дословно с сайта (http://www.cplusplus.com/reference/string/string/replace/) (я добавил комментарий для указания на рассматриваемые строки):

// replacing in a string
#include 
#include 
using namespace std;

int main ()
{
  string base="this is a test string.";
  string str2="n example";
  string str3="sample phrase";
  string str4="useful.";

  // function versions used in the same order as described above:

  // Using positions:                 0123456789*123456789*12345
  string str=base;                // "this is a test string."
  str.replace(9,5,str2);          // "this is an example string."
  str.replace(19,6,str3,7,6);     // "this is an example phrase."
  str.replace(8,10,"just all",6); // "this is just a phrase."
  str.replace(8,6,"a short");     // "this is a short phrase."
  str.replace(22,1,3,'!');        // "this is a short phrase!!!"

  // Using iterators:                      0123456789*123456789*
  string::iterator it = str.begin();   //  ^
  str.replace(it,str.end()-3,str3);    // "sample phrase!!!"

  // *** this next line and most that follow are illegal right? ***

  str.replace(it,it+6,"replace it",7); // "replace phrase!!!"
  it+=8;                               //          ^
  str.replace(it,it+6,"is cool");      // "replace is cool!!!"
  str.replace(it+4,str.end()-4,4,'o'); // "replace is cooool!!!"
  it+=3;                               //             ^
  str.replace(it,str.end(),str4.begin(),str4.end());
                                       // "replace is useful."
  cout << str << endl;
  return 0;
}

В моей версии замены реализован с точки зрения временной строки, с которой я создаю затем подкачку *this. Это ясно делает недействительным любые итераторы. Таким образом, я корректен, что пример недопустим? потому что это хранит итераторы, делает замену и затем использует итераторы снова?

В моей копии стандарта (ISO 14882:2003 - 21.3p5) говорится:

Ссылки, указатели и итераторы, относящиеся к элементам последовательности basic_string, могут делаться недействительным следующим использованием того объекта basic_string:

- As an argument to non-member functions swap() (21.3.7.8), 
  operator>>() (21.3.7.9), and getline() (21.3.7.9).
- As an argument to basic_string::swap().
- Calling data() and c_str() member functions.
- Calling non-const member functions, except operator[](), at(),
  begin(), rbegin(),
  end(), and rend().
- Subsequent to any of the above uses except the forms of insert() and
  erase() which return iterators,
  the first call to non-const member functions operator[](), at(), begin(),
  rbegin(), end(), or rend().

Запись о функциях членства неконстанты, кажется, покрывает это. Таким образом, если я не пропускаю что-то, затем этот код использует делаемое недействительным право итераторов? Конечно, этот код работает просто великолепно с libstdc gcc ++, но все мы знаем, что это ничего не доказывает до соответствия стандартов.

11
задан Evan Teran 1 July 2010 в 19:10
поделиться

1 ответ

Это будет работать, если replace работает на месте. Я не думаю, что это нужно реализовывать таким образом. Так что да, я бы сказал, что ваш код технически незаконен.

2
ответ дан 3 December 2019 в 12:17
поделиться
Другие вопросы по тегам:

Похожие вопросы: