Подтвердить что ты не робот

Можете ли вы присвоить подстроку std::string самому себе?

Недавно я обнаружил, что нужно заменить содержимое std::string на подстроку. Самая логичная функция, которую я вызываю здесь, я думаю, это следующее: http://www.cplusplus.com/reference/string/string/assign/:

подстрока (2)     Строка & assign (const string & str, size_t subpos, size_t sublen);
   
    Копирует часть str, начинающуюся с подпозиции позиции символа, и охватывает сублимированные символы (или до конца строки, если либо str слишком короткая, либо если sublen - string:: npos).

    ул
        Другой строковый объект, значение которого либо скопировано, либо перемещено.

    subpos
        Позиция первого символа в str, который копируется в объект как подстрока. Если это больше, чем длина строки, она выбрасывает out_of_range. Примечание: первый символ в str обозначается значением 0 (не 1).

    sublen
        Длина подстроки, подлежащей копированию (если строка короче, скопировано столько символов, сколько возможно).     Значение string:: npos указывает все символы до конца строки.

Однако я не уверен, разрешено ли это, или если оно может испортить строковые данные. Я знаю, что memcpy(), например, не разрешает (или, по крайней мере, не гарантирует, что в случае некоррупции) будет перезаписываться область памяти (сама часть) (см. memcpy() vs memmove()). Но я не знаю, имеет ли вышеуказанный метод то же ограничение.

В более общем плане, можете ли вы прокомментировать, должен ли я сам выяснить ответ на этот вопрос? Ничто в документации, к которой я привязан, не дает мне понять, каков ответ на этот вопрос, за исключением, возможно, определителя "Другой" в описании параметра str ( "Другой строковый объект" ), который, по-видимому, подразумевает это не может быть этим объектом, хотя я не считаю это однозначным. Это слабость в документации?

4b9b3361

Ответ 1

Нет.

Эта операция определяется как [string:: assign]/4:

basic_string& assign(const basic_string& str, size_type pos,
    size_type n = npos);

Эффекты: определяет эффективную длину rlen строки для назначения как меньше n и str.size() - pos, и вызывает assign(str.data() + pos rlen).

(dat typo)

Тогда:

basic_string& assign(const charT* s, size_type n);

Эффекты: Заменяет строку, управляемую *this строкой длины n, элементы которой являются копией тех, на которые указывает s.

Ничего об этом ничего не говорится о том, является ли str.assign(str, 0) безопасным (в частности, мы не можем знать, когда произойдет копирование каждого символа!).

Поэтому я настоятельно рекомендую вам не делать этого.