LINUX.ORG.RU

История изменений

Исправление 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() и потом продолжает пользоваться объектом, то он ССЗБ.