首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >GCC中libstdc++的libstdc++实现及自定义指针

GCC中libstdc++的libstdc++实现及自定义指针
EN

Stack Overflow用户
提问于 2018-02-28 18:35:36
回答 1查看 178关注 0票数 1

最近我试着研究libstdc++源代码(GCC 7.2),但我很困惑。也许我错过了一些重要的东西,但我开始认为不可能实现完全符合标准的basic_string类。

这是我面临的一个问题。

  1. basic_string应该能够接受自定义分配器类作为模板参数。
  2. 分配方法是分配器的一部分。
  3. 允许分配返回用户定义类型的对象,这些对象“就像指向分配数据的指针一样”。我们把它叫做my_pointer
  4. NullablePointerRandomAccessIterator.只满足my_pointer的要求。所有其他要求都是可选的。根据标准,我们可能无法将basic_string my_pointer转换为图表*类型(另一个模板参数),因为它是可选的。
  5. 另一方面,const图表* c_str()方法应该作为标准的一部分来实现,因此我们必须知道如何进行这种转换。

第四项和第五项相互矛盾,我不知道如何解决。希望你能帮我弄清楚。

谢谢!

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-02-28 19:02:15

标准中有几个要求,它们一起确保转换是可能的,至少是间接的。

  1. 给定basic_­string<charT, traits, Allocator>标准要求 charTallocator_traits<Allocator>::value_type相等。
  2. allocator_traits<Allocator>::pointer 是必需的要么是Allocator::pointer要么是Allocator::value_type*
代码语言:javascript
复制
- In the former case, given a `Allocator::pointer` `p`, `*p` [is required](https://timsong-cpp.github.io/cppwp/allocator.requirements#tab:utilities.allocator.requirements) to be `Allocator::value_type&`.
- In the latter case, everything is trivial.

  1. Allocator::pointer 是必需的 to 连续迭代器,这需要给定一个连续迭代器q*(q + n) == *(addressof(*q) + n)
  2. 给定一个Allocator aa.allocate(n) 是必需的返回一个Allocator::pointer

把一切结合在一起,就意味着这一切都是正确的。

代码语言:javascript
复制
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的结果。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/49036340

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档