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);
}
これは、2 つの文字列のアロケーターが同じ場合にのみ参照カウントをインクリメントします。これは理にかなっています。ただし、コピー コンストラクターは次のとおりです。
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()
は、2 番目のアロケータのコピーです。なんで?operator==()
forallocator
が false を返す唯一の方法は、ユーザーがカスタム アロケーターを使用している場合です。しかし、それが本当だとしても、コピーされたアロケータは元のアロケータと同じになると思いますよね? そう:
- なぜアロケーターを比較するのですか?
- アロケータをコピー構築し、コピーをオリジナルと比較するのはなぜですか?
- コピーをオリジナルと比較すると false が返されるユースケースは何ですか?
アップデート
はい、_M_grab()
別の場所で使用されます: 割り当て用です。この場合、渡されるアロケーター_M_grab()
は異なります。罰金。しかし、コピー構築してからコンストラクターのアロケーターを比較する理由はまだないようですstring
。