История изменений
Исправление Corey, (текущая версия) :
Я не до конца понял что означает это «неопределенное, но валидное состояние».
Обычно та сторона, которая принимает rvalue reference, полученное через std::move(), сама решает, как распорядиться выковыриванием внутренностей из переданного объекта. Например, если строка реализована таким образом, что внутри нее есть char* str и size_t size, то move-конструктор может просто скопировать себе указатель и размер, а у источника - занулить их. Отсюда получится, что если после этой операции ты попробуешь сделать source[0], получишь NPE. Но может быть и такое, что ты не знаешь, что происходит внутри такого move-конструктора, поэтому тебя предупреждают: если уж передал rvalue reference, будь добр, не пользуй больше этот объект. А валидным в этом случае, я думаю, это состояние останется из-за того, что методы, не требующие соблюдения никаких инвариантов (например, string::clear()), могут продолжать функционировать.
В любом случае, если юзер сделал std::move() и потом продолжает пользоваться объектом, то он ССЗБ.
Исходная версия Corey, :
Я не до конца понял что означает это «неопределенное, но валидное состояние».
Обычно та сторона, которая принимает rvalue reference, полученное через std::move(), сама решает, как распорядиться выковыриванием внутренностей из переданного объекта. Например, если строка реализована таким образом, что внутри нее есть char* str и size_t size, то move-конструктор может просто присвоить скопировать себе указатель и размер, а у источника - занулить их. Отсюда получится, что если после этой операции ты попробуешь сделать source[0], получишь NPE. Но может быть и такое, что ты не знаешь, что происходит внутри такого move-конструктора, поэтому тебя предупреждают: если уж передал rvalue reference, будь добр, не пользуй больше этот объект. А валидным в этом случае, я думаю, это состояние останется из-за того, что методы, не требующие соблюдения никаких инвариантов (например, string::clear()), могут продолжать функционировать.
В любом случае, если юзер сделал std::move() и потом продолжает пользоваться объектом, то он ССЗБ.