В блоге Скотта Мейера есть замечательная мысль: Во-первых, не все запросы на копирование могут быть заменены ходами. Только запросы на копирование для rvalues имеют право на оптимизацию. Во-вторых, не все типы поддерживают операции перемещения, которые более эффективны, чем операции копирования. Примером является std :: array. В-третьих, даже типы, которые поддерживают эффективные операции перемещения, могут поддерживать их только некоторое время. Пример: std :: string. Он поддерживает ходы, но в случаях, когда std :: string реализуется с использованием SSO (оптимизация небольших строк), маленькие строки так же дороги, как и для копирования! Возможно, вы можете классифицируйте свои типы соответственно, а затем решите, для чего все нуждаются , перемещать семантику. Обратите внимание, что существуют ограничения на компилятор, автоматически генерирующий операции перемещения операторов / присваивания, поэтому вам было бы полезно помнить об этом. Это помогает, когда вы явно задаете элементы перемещения. Для классов, в которых вы явно не указываете перемещать элементы, есть несколько точек беспокойства. Также существует проблема явно / неявно удаленных элементов перемещения, которые препятствуют копированию из rvalues . Очень ценный источник проблем с неявной генерацией элементов перемещения можно найти в статье Страуструпа под названием To Move or Not to Move . Что касается обработки исключений с семантикой перемещения, я бы предложил Сообщение Dave Abraham Исключительно перемещение . Я попытаюсь вернуться к этому ответу с некоторыми примерами, когда я получу время. Надеюсь, пока ссылки, упомянутые выше, помогут вам начать работу.
Изменение switchMap на mergeMap решило проблему.
Документация по switchMap: Подобно mergeMap (), но когда источник, из которого наблюдается наблюдаемая исходная программа, отменяет любые предыдущие подписки внутренней наблюдаемой.