Перемещение std:: не должно использоваться на объектах, объявленных const или const &
Перемещение std:: не должно использоваться на объектах, объявленных const или const &.
Когда вы используете std::move()
на объекте, он приведен в rvalue. Затем компилятор управляет ресурсами объекта, вызывая конструктор или оператор с ближайшим соответствующим списком параметров. Если вы звоните std::move()
на const
или const&
type object, вызов возвращает const
или const&
type rvalue. Потому что перемещайте конструкторы и операторы не берут const
аргумент типа, компилятор вызывает конструктор копирования или оператор вместо конструктора перемещения или оператора. Рассмотрим этот фрагмент кода, где a 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
аргумент type. Компилятор вызывает конструктор копирования и копирует ресурсы message
в text
.Потому что std::move()
не перемещает const
или const&
введите объект, избегайте использования std::move()
на const
или const&
объекты. Если вы намерены переместить ресурсы из объекта, не объявляйте его как const
или const&
.
Polyspace® флаги использования std::move()
на:
Объекты, которые объявлены const
или const&
.
Объекты, которые преобразуются в const
или const&
.
Если вы ожидаете нарушения правил, но не видите его, обратитесь к разделу «Стандартные нарушения кодирования не отображаются».
Группа: Библиотека языковой поддержки |
Категория: Необходимый, Автоматизированный |