Я ищу код для basic_string
(в комплекте с g ++ 4.2.1). Конструктор копирования делает использование grab()
функции «захватить» копию строки (приращение его референс-счетчик):Ссылка-подсчет std :: string
_CharT* _M_grab(const _Alloc& __alloc1, const _Alloc& __alloc2) {
return (!_M_is_leaked() && __alloc1 == __alloc2) ? _M_refcopy() : _M_clone(__alloc1);
}
Это увеличивает значение референс-счетчик только если распределители для двух строк одинаковы -- имеет смысл. Тем не менее, конструктор копирования:
basic_string(const basic_string& __str)
: _M_dataplus(__str._M_rep()->_M_grab(_Alloc(__str.get_allocator()), __str.get_allocator()),
__str.get_allocator())
{ }
Первый распределитель, передаваемый в _M_grab()
является копией второго. Зачем? Единственный способ, которым operator==()
для allocator
может вернуть false, - это если пользователь использует собственный распределитель. Однако, даже если это правда, вы можете подумать, что скопированный распределитель сравняется с его оригинальным, верно? Итак:
- Зачем сравнивать распределители?
- Зачем копировать-построить распределитель и сравнить копию с оригиналом?
- Что такое прецедент, когда сравнение копии с ее оригиналом вернет false?
Update
Да, _M_grab()
используется в одном другом месте: для назначения. В этом случае распределители передавались в _M_grab()
: разные. Хорошо. Но по-прежнему нет причин как для копирования, так и для сравнения распределителей в конструкторе для string
.
Я не могу видеть остальную часть кода здесь, но возможно ли реальная утилита для того, когда '_M_grab()' вызывается из другого места, и здесь дополнительная копия распределителя выполняется только для см., является ли распределитель как способным к копированию, так и сопоставлением копий? Очевидно, что если первое не соответствует действительности, вызов даже не будет компилироваться, но если последнее неверно, управление ресурсами будет вести себя корректно. – seh
@seh: Ваш «последний» случай имеет какой-то смысл, но я не могу придумать прецедента, где копировально-распределенный распределитель не сравнится с его оригиналом - кажется очень странным. Однако, по-видимому, это не так уж редко, потому что авторы этого класса строк рассматривали это. Поэтому мне любопытно, что может быть в этом случае. –