Переместите и скопируйте операторы присваивания, или перемещу или соответственно скопирую базовые классы и элементы данных класса, без любых побочных эффектов.
Переместите и скопируйте операторы присваивания, или перемещу или соответственно скопирую базовые классы и элементы данных класса, без любых побочных эффектов.
Когда вы будете использовать перемещение и копируете операторы присваивания, вы ожидаете, что операция перемещает или копирует исходный объект в целевой объект, не производя побочных эффектов. Если перемещение или операторы присваивания копии класса производят побочные эффекты, инвариант объекта может измениться во время перемещения или скопировать присвоения. Рассмотрите этот код где несколько объектов класса C
присвоены копии друг другу.
class C{ //... C& operator=(const C& oth) { value = oth.value / 2; return *this; } public: int value; }; int main(){ C a, b, c; a.value = 48; // … b = a; // b.m = 24 c = b; // c.m = 12 a = c; // a.m = 6 }
value
в целевом объекте становится половиной value
в исходном объекте. После трех последовательных операций присвоения копии, a.value
становится 6
, который неожидан. Алгоритмы ожидают перемещение и копируют операторы присваивания, которые не изменяют объектный инвариант. Если перемещение или операторы присваивания копии класса имеют побочные эффекты, которые изменяют объектный инвариант, пользование библиотеками алгоритма, такими как стандартная библиотека шаблонов (STL) может привести к неожиданным результатам.Поскольку вы используете перемещение и много раз копируете присвоения в коде, любой код создания побочного эффекта может сделать код медленнее и интенсивно использующим ресурсы. В операторе присваивания перемещения код, которые производят побочные эффекты, может также заставить компилятор использовать операцию копии с каждым присвоением, которое неэффективно.
Чтобы обеспечить оптимальную и надежную эффективность во время перемещения и присвоения копии, выполните только эти операции в перемещении и скопируйте операторы присваивания:
Скопируйте или переместите элементы данных и базовые классы.
Возвратите указатель *this
.
Если возможно, устанавливает перемещенный - от объекта до допустимого состояния.
Избегайте лишнего кода, которые добавляют несвязанные побочные эффекты или эффективность наверху.
Polyspace® отмечает копию и операторы присваивания перемещения, если у них есть какие-либо побочные эффекты. Операции, которые не имеют побочных эффектов, включают:
Переместите или скопируйте присвоение
Возврат *this
оператор
Используя операторы отношения или операторы сравнения
Изменение перемещенного - от объекта
Если перемещение или операторы присваивания копии начинают другие операции, Polyspace отмечает объявление оператора, перечисляет код, который производит побочные эффекты в панели Result Details, и затем подсвечивает код в панели Source.
Если вы ожидаете нарушение правила, но не видите его, обратитесь к Кодированию Стандартных Нарушений, Не Отображенных.
Группа: операторы |
Категория: необходимый, автоматизированный |