我最近尝试研究libstdc++源代码(GCC 7.2),感到困惑。可能我错过了一些重要的事情,但是我开始认为不可能实现完全符合C++标准的 basic_string 类。
这是我面临的一个问题。
项目4和5冲突,我不知道如何解决。
希望你能帮助我弄清楚。
谢谢!
最佳答案
该标准有几项要求,始终共同确保至少可以间接进行转换
basic_string<charT, traits, Allocator>
,the standard requires charT
和allocator_traits<Allocator>::value_type
相等。 allocator_traits<Allocator>::pointer
is required可以是Allocator::pointer
或Allocator::value_type*
。Allocator::pointer
p
,*p
is required为Allocator::value_type&
。 Allocator::pointer
is required是contiguous iterator,这需要给定一个连续的迭代器q
,*(q + n) == *(addressof(*q) + n)
Allocator
a
,a.allocate(n)
is required返回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
的结果的位置