Станд.:: перемещение не должно использоваться на объектах, объявил const или const&.
Станд.:: перемещение не должно использоваться на объектах, объявил const или const&.
Когда вы используете std::move()
на объекте это брошено в rvalue. Компилятор затем управляет ресурсами в объекте путем вызова конструктора или оператора с самым близким списком параметров соответствия. Если вы вызываете std::move()
на const
или const&
текстовый объект, вызов возвращает const
или const&
введите rvalue. Поскольку конструкторы перемещения и операторы не берут const
аргумент типа, компилятор вызывает конструктора копии или оператор вместо конструктора перемещения или оператор. Рассмотрите этот фрагмент кода где const
объект копируется, когда вы можете ожидать перемещение после вызова std::move()
.
class string{ //... public: string(const string& rhs);// copy contructor string(string&& rhs); //move constructor }; void print(string text) { cout<<text; //... } int main(){ int const message = "Error"; //.. print(std::move(message))// the copy constructor is called }
std::move(message)
rvalue const string&&
. Между перемещением и конструкторами копии класса string
, только конструктор копии принимает const
аргумент типа. Компилятор вызывает конструктора копии и копирует ресурсы message
в text
.Поскольку std::move()
не перемещает const
или const&
текстовый объект, избегайте использования std::move()
на const
или const&
объекты. Если вы намереваетесь переместить ресурсы от объекта, не объявляйте его как const
или const&
.
Polyspace® отмечает использование std::move()
на:
Объекты, которые объявляются const
или const&
.
Объекты, которые брошены к const
или const&
.
Если вы ожидаете нарушение правила, но не видите его, обратитесь к Кодированию Стандартных Нарушений, Не Отображенных.
Группа: вспомогательная библиотека Языка |