Недавно я хотел реализовать функцию неявного совместного использования, как это делает Qt со своими QSharedData
а также QSharedDataPointer
классы, поэтому я взглянул на их источники и на месте QSharedData
Я нашел эти три строки:
private:
// using the assignment operator would lead to corruption in the ref-counting
QSharedData &operator=(const QSharedData &);
Однако я не понимаю, как мог operator=
прервать подсчет ссылок.
Если бы я просто не сделал его закрытым и оставил его реализацию пустой, разве это не послужило бы той же цели?
то есть если бы я написал просто так:
public:
QSharedData &operator=(const QSharedData & ) { return *this; }
Вся цель QSharedData
это поддерживать счетчик ссылок. Если вы назначаете одно другому, что должно произойти с подсчетом ссылок на каждой стороне? Как вы правильно определили: ничего. Просто не имеет смысла назначать один QSharedData
к другому, и, следовательно, разумный курс действий состоит в том, чтобы предотвратить это во время компиляции.
Нет, это было бы плохо, если он делает подсчет ссылок, ему нужно вести бухгалтерский учет и просто вернуть его this
будет означать, что есть копии QSharedData
неучтенный. этот пример из C ++ faq в основном показывает, какой вид бухгалтерского учета необходим для operator =
в объекте подсчета ссылок.