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