Можно ли вызывать std::basic_string::find для уже перемещенной строки?

Согласно станд:: двигаться, перемещенный std::string находится в «действительном, но неуказанном состоянии», что означает, что в строке можно использовать функции без предварительных условий. Можно ли использовать std::basic_string::find в неуказанной строке? Есть ли у std::basic_string:find предварительное условие?

#include <string>
int main() {
  std::string str = "hello";
  auto s = std::move(str);
  str.find("world");
}

Я не понимаю, какой возможный вариант использования у вас есть для этого. Я не вижу практической причины, так как состояние объекта не указано.

paddy 09.04.2022 14:12

Это нормально, но бесполезно.

Passer By 09.04.2022 14:17

Возможный пример — перебор вектора строк с помощью find_if и условия с использованием find, перемещение строки из вектора, если условие выполняется, и повторное выполнение find_if над вектором. В этом случае мы можем вызвать find для неуказанного элемента.

wanwan 09.04.2022 14:21

str будет в допустимом состоянии. Скорее всего, нулевая строка, но не гарантируется. Например, оптимизированный код для строк может оставлять короткие строки в состоянии, отличном от более длинных.

stark 09.04.2022 14:24

Допустим, разрешено. Но тогда возвращаемое значение непредсказуемо, так какой в ​​этом смысл?

HolyBlackCat 09.04.2022 14:28

Я удивлен вашим вопросом: я бы указал вам на то самое место, где вы связались. Как вы думаете, чем ваш код отличается от кода, приведенного в качестве примера?

Ulrich Eckhardt 09.04.2022 14:31

Я думаю, что здесь есть непонимание цели механики движения. Вы не должны «перемещать строку из вектора», а затем снова find_if на этом векторе. Здесь есть вопрос «понимание механики движения», который ждет своего ответа...

DevSolar 09.04.2022 14:32

@UlrichEckhardt В примере в ссылке говорится, что back нельзя использовать в перемещенной строке, но empty можно, но я не уверен насчет find.

wanwan 09.04.2022 14:38

Если вы хотите, чтобы пустая строка осталась позади, просто переместите пустую строку в вектор после удаления старой.

paddy 09.04.2022 14:39

Итак, вызов find для перемещенной строки не является UB (в отличие от back), но мы не должны этого делать, потому что содержимое перемещаемой строки непредсказуемо, верно?

wanwan 09.04.2022 14:47

Каково будет время выполнения find на неуказанном действительном string?

Sebastian 09.04.2022 14:52

@Sebastian Например, при сборе строк, соответствующих условию из вектора, путем move извлечения строки из него, и условие включает find. (Для этого, я думаю, мне нужно несколько раз перебрать вектор.)

wanwan 09.04.2022 15:22

При разумной реализации результатом перемещения из строки может быть то, что исходная строка по-прежнему содержит исходный текст или может быть пустой. Если вы не знаете какой, искать его бессмысленно.

Pete Becker 09.04.2022 15:55

@PeteBecker Если вы отбросите результат find после перемещения, не имеет значения, каков был результат. Однако, если программа тормозит, так как "указывает" на строку размером 1 Гб...

Sebastian 09.04.2022 16:33

@ Себастьян - если вы отбросите результат find после перемещения, это, как я уже сказал, бессмысленно.

Pete Becker 09.04.2022 16:36

@PeteBecker Что вы подразумеваете под «это» бессмысленно? Возможно, вам все же придется подождать, если оптимизатору не удастся удалить вызов find. (Он должен обнаружить, что результат отбрасывается, даже при возможно сложном потоке программы; он должен определить, что find является чистой функцией; он должен создать эффективный ассемблерный код из возможно сложного потока программы, где возможно перемещение и отбрасывание. только пограничные случаи.)

Sebastian 09.04.2022 20:17

@Sebastian -- find не имеет побочных эффектов, поэтому единственная причина для его вызова заключается в том, что вы заботитесь о возвращаемом значении. Если вы отбросите значение, то в первую очередь нет смысла делать вызов. Звонок бессмысленный.

Pete Becker 09.04.2022 20:52

@PeteBecker Только в том случае, если вы знаете, что он отбрасывается, что не всегда так, в зависимости от хода программы. В этом случае, возможно (?) ОП может логически вывести, что результат find всегда позже отбрасывается, когда он был перемещен. Возможно, в случае OP невозможно или есть другие недостатки для хранения этой логической информации вместе со строкой, или требуется слишком много времени для проверки логического значения вокруг вызова find.

Sebastian 09.04.2022 20:56
Формы c голосовым вводом в React с помощью Speechly
Формы c голосовым вводом в React с помощью Speechly
Пытались ли вы когда-нибудь заполнить веб-форму в области электронной коммерции, которая требует много кликов и выбора? Вас попросят заполнить дату,...
Стилизация и валидация html-формы без использования JavaScript (только HTML/CSS)
Стилизация и валидация html-формы без использования JavaScript (только HTML/CSS)
Будучи разработчиком веб-приложений, легко впасть в заблуждение, считая, что приложение без JavaScript не имеет права на жизнь. Нам становится удобно...
Flatpickr: простой модуль календаря для вашего приложения на React
Flatpickr: простой модуль календаря для вашего приложения на React
Если вы ищете пакет для быстрой интеграции календаря с выбором даты в ваше приложения, то библиотека Flatpickr отлично справится с этой задачей....
В чем разница между Promise и Observable?
В чем разница между Promise и Observable?
Разберитесь в этом вопросе, и вы значительно повысите уровень своей компетенции.
Что такое cURL в PHP? Встроенные функции и пример GET запроса
Что такое cURL в PHP? Встроенные функции и пример GET запроса
Клиент для URL-адресов, cURL, позволяет взаимодействовать с множеством различных серверов по множеству различных протоколов с синтаксисом URL.
Четыре эффективных способа центрирования блочных элементов в CSS
Четыре эффективных способа центрирования блочных элементов в CSS
У каждого из нас бывали случаи, когда нам нужно отцентрировать блочный элемент, но мы не знаем, как это сделать. Даже если мы реализуем какой-то...
3
18
75
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Согласно описанию std::basic_string:find в [строка.найти]:

constexpr size_type F(const charT* s, size_type pos) const;

has effects equivalent to: return F(basic_­string_­view<charT, traits>(s), pos);

который имеет следующие эффекты

Effects: Let G be the name of the function. Equivalent to:

basic_string_view<charT, traits> s = *this, sv = t; 
return s.G(sv, pos);

который создаст basic_string_view из *this, который имеет предварительные условия, что [str, str + len) является допустимым диапазоном, и поскольку перемещенная строка Все еще находится в допустимом состоянии, так что это нормально.

Спасибо за ответ! Кстати, всегда ли возвращаемое значение find в перемещенной строке std::string::npos? или непредсказуемый?

wanwan 09.04.2022 15:14

Непредсказуемый, поскольку он находится в неопределенном состоянии.

康桓瑋 09.04.2022 15:25

Другие вопросы по теме