Перемещение 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&.
Если вы ожидаете нарушения правил, но не видите его, обратитесь к разделу «Стандартные нарушения кодирования не отображаются».
| Группа: Библиотека языковой поддержки |
| Категория: Необходимый, Автоматизированный |