Краткий ответ:
Да, вы должны очистить его, потому что стандарт явно не определяет, в каком состоянии находится список источников после перемещения.
Кроме того, всегда вызывается clear()
когда контейнер повторно используется после перемещения, это простое правило, которое не должно вызывать значительных накладных расходов, даже если оно избыточно.
Более длинный ответ:
Как я уже упоминал в некоторыхкомментарии, я не могу представить никакой законной и разумной реализации, для которой источник std::list
будет чем-то иным, кроме пустого std::list
после использования в качестве источника для конструктора перемещения (спасибо @Lightness Races в Orbit за копание в стандарте).Построение перемещения должно происходить за линейное время, что не допускает никаких операций для каждого объекта, а AFAIK также не позволяет иметь небольшой буфер фиксированного размера, который может быть источником оставшихся «зомби» элементов всписок источников.
Однако, даже если вы можете отследить все это в стандарте, вам все равно придется документировать это всякий раз, когда вы пропускаете clear()
в коде, и опасаться, что кто-то изменит код, заменивstd::list
с доморощенным контейнером, который не в полной мере отвечает требованиям стандарта (например, для использования оптимизации небольшого буфера).Кроме того, предыдущий оператор действителен только для хода конструкция .При назначении хода абсолютно возможно, что перемещенный контейнер не будет пустым.
В заключение: даже если технически правильно было не использовать clear
в данном конкретном случае, это не стоит психических усилийчтобы сделать это (и если вы находитесь в среде, где это того стоит, вы, вероятно, настраиваете свой код на конкретную версию стандартной библиотеки, а не на стандартный документ в любом случае).