Проникся c++11, начал разбираться с move semantics. По ходу возник вопрос: могут быть ситуации, когда содержимое объекта перекочевало в другой посредством move, и объект остался «пустым». Всё хорошо когда «пустое» состояние объекта валидно (например, пустой vector) и/или пустой объект сразу становится недоступен (если он был временный, например). Но если оба этих условия не выполняются, как быть? Скажем, я пишу библиотеку, у меня есть какой-то класс, у объектов которого не бывает валидного пустого состояния, а пользователь библиотеки делает std::move из такого объекта него, а потом вызывает какой-то его метод. Нужно ли это предусмотреть и что в таких ситуациях делать? throw logic_error? assert? abort? ничего (UB)?
Мне пока кажется что с одной стороны, вроде самое правильное добавить assert'ы (громко падает в debug сборке и не тратит ресурсы на проверки в release), с другой - в каждый метод пихать проверку ой как не хочется.