我正在查看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==()
for可能返回 false的唯一方法allocator
是用户使用自定义分配器。但是,即使这是真的,您也会认为复制的分配器将与其原始分配器进行比较,对吗?所以:
- 为什么要比较分配器?
- 为什么要复制构建分配器并将副本与原始文件进行比较?
- 将副本与其原件进行比较会返回 false 的用例是什么?
更新
是的,_M_grab()
用在另一个地方:分配。在这种情况下,传递给的分配器_M_grab()
是不同的。美好的。但是似乎仍然没有理由同时复制构造然后比较构造函数中的分配器string
。