Я смотрю на код для basic_string
(в комплекте с g ++ 4.2.1).Конструктор копирования использует функцию grab()
, чтобы «захватить» копию строки (увеличить ее счетчик ссылок):
_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, - это если пользователь использует собственный распределитель.Однако, даже если это правда, вы бы подумали, что скопированный распределитель будет сравниваться равным его оригиналу, верно?Итак:
- Зачем вообще сравнивать распределители?
- Зачем копировать-создавать распределитель и сравнивать копию с оригиналом?
- Какой пример использования при сравнениикопия с оригиналом вернула бы ложь?
Обновление
Да, _M_grab()
используется в другом месте: для присвоения.В этом случае распределители, переданные в _M_grab()
, отличаются .Хорошо.Но, похоже, нет оснований для копирования-конструирования, а затем для сравнения распределителей в конструкторе для string
.