Операция копирования изменяет представитель данных исходного объекта
Этот дефект возникает, когда конструктор копирования или оператор назначения копирования изменяет изменяемый представитель данных своего исходного операнда.
Для образца, этот конструктор копирования A
изменяет представитель данных m
его исходного операнда other
:
class A { mutable int m; public: ... A(const A &other) : m(other.m) { other.m = 0; //Modification of source } }
Операция копирования с конструктором копирования (или оператором назначения копирования):
className new_object = old_object; //Calls copy constructor of className
old_object
на операнд назначения new_object
. После операции вы ожидаете, что операнд назначения будет копией немодифицированного операнда источника. Если исходный операнд изменяется во время копирования, это предположение нарушается.Не изменяйте исходный операнд в операции копирования.
Если вы изменяете исходный операнд в конструкторе копирования для реализации операции перемещения, используйте вместо этого конструктор перемещения. Перемещение конструкторов определяется в стандарте C++ 11 и более поздних версиях.
Группа: Объектно-ориентированная |
Язык: C++ |
По умолчанию: On для рукописного кода, off для сгенерированного кода |
Синтаксис командной строки
: COPY_MODIFYING_SOURCE |
Влияние: Средний |