basic_string GCC 和自定义指针中 libstdc++ 的实现

basic_string implementation of libstdc++ in GCC and custom pointers

最近想研究一下libstdc++源码(GCC 7.2),一头雾水。可能我错过了一些重要的东西,但我开始认为完全符合 C++ 标准的 basic_string class 是不可能实现的。

这是我遇到的一个问题。

  1. basic_string 应该能够接受自定义分配器 class 作为模板参数。
  2. allocate 方法需要作为分配器的一部分。
  3. 分配 允许return 用户定义类型的对象"acts like pointer to allocated data"。我们称它为my_pointer
  4. my_pointer 应仅满足 NullablePointerRandomAccessIterator 的要求。所有其他要求都是可选的。根据标准,我们可能无法将 my_pointer 转换为 CharT* 类型(另一个 basic_string 模板参数)因为它是可选的。
  5. 另一方面 const CharT* c_str() 方法应该作为标准的一部分来实现,所以我们必须知道如何进行这个转换.

第4条和第5条有冲突,不知如何解决。 希望你能帮我弄清楚。

谢谢!

标准中有几项要求始终确保转换是可能的,至少是间接的

  1. 给定basic_­string<charT, traits, Allocator>the standard requirescharTallocator_traits<Allocator>::value_type相等。

  2. allocator_traits<Allocator>::pointer is requiredAllocator::pointerAllocator::value_type*.

    • 在前一种情况下,给定一个Allocator::pointerp*pis requiredAllocator::value_type&.

    • 在后一种情况下,一切都是微不足道的。

  3. Allocator::pointer is required to be a contiguous iterator,这需要,给定一个连续的迭代器 q*(q + n) == *(addressof(*q) + n)

  4. 给定一个Allocatora,a.allocate(n)is required到return一个Allocator::pointer.

将所有内容组合在一起,这意味着这总是正确的

template<typename charT, typename traits = /* ... */, typename Allocator = /* ... */>
class basic_string
{
    typename std::allocator_traits<Allocator>::pointer _data;
    // ...

public:
    charT* c_str() { return std::addressof(*_data); }
    // ...
};

其中 _data 可能存储先前调用 Allocator::allocate

的结果