Эта мысль пришла сегодя в голову на работе, когда при исследовании сброшеной корки пришлось заглянуть в исходники гнутого basic_string.
Там же лютый ад (/usr/include/c++/6/bits/basic_string.h):
...
struct _Rep_base
{
size_type _M_length;
size_type _M_capacity;
_Atomic_word _M_refcount;
};
struct _Rep : _Rep_base {
...
}
struct _Alloc_hider : _Alloc
{
_Alloc_hider(_CharT* __dat, const _Alloc& __a) _GLIBCXX_NOEXCEPT
: _Alloc(__a), _M_p(__dat) { }
_CharT* _M_p; // The actual data.
};
private:
// Data Members (private):
mutable _Alloc_hider _M_dataplus;
_CharT*
_M_data() const _GLIBCXX_NOEXCEPT
{ return _M_dataplus._M_p; }
...
_Rep*
_M_rep() const _GLIBCXX_NOEXCEPT
{ return &((reinterpret_cast<_Rep*> (_M_data()))[-1]); }
...
Тут можно прямо конкурс устраивать: кто объяснит, суть
return &((reinterpret_cast<_Rep*> (_M_data()))[-1]);
Я для сравнения заглянул в libc++ имплементацию строк, там же все куда адекватнее.