Станд.:: перемещение не должно использоваться на объектах, объявил 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() on:
Объекты, которые объявляются const или const&.
Объекты, которые брошены к const или const&.
Если вы ожидаете нарушение правила, но не видите его, обратитесь к Кодированию Стандартных Нарушений, Не Отображенных.
| Группа: вспомогательная библиотека Языка |
| Категория: необходимый, автоматизированный |