最近我试着研究libstdc++源代码(GCC 7.2),但我很困惑。也许我错过了一些重要的东西,但我开始认为不可能实现完全符合标准的basic_string类。
这是我面临的一个问题。
第四项和第五项相互矛盾,我不知道如何解决。希望你能帮我弄清楚。
谢谢!
发布于 2018-02-28 19:02:15
标准中有几个要求,它们一起确保转换是可能的,至少是间接的。
basic_string<charT, traits, Allocator>、标准要求 charT和allocator_traits<Allocator>::value_type相等。allocator_traits<Allocator>::pointer 是必需的要么是Allocator::pointer要么是Allocator::value_type*。- 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.
Allocator::pointer 是必需的 to 连续迭代器,这需要给定一个连续迭代器q,*(q + n) == *(addressof(*q) + n)Allocator a,a.allocate(n) 是必需的返回一个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的结果。
https://stackoverflow.com/questions/49036340
复制相似问题