Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/148.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ libstdc和x2B的基本字符串实现+;在GCC和自定义指针中_C++_Pointers_Language Lawyer_Stdstring_Allocator - Fatal编程技术网

C++ libstdc和x2B的基本字符串实现+;在GCC和自定义指针中

C++ libstdc和x2B的基本字符串实现+;在GCC和自定义指针中,c++,pointers,language-lawyer,stdstring,allocator,C++,Pointers,Language Lawyer,Stdstring,Allocator,我最近试图学习libstdc++源代码(gcc7.2),但感到困惑。可能我错过了一些重要的东西,但是我开始认为不可能实现强> Basic字符串St/ 类,完全符合C++标准。p> 这是我面临的一个问题 basic_string应该能够接受自定义分配器类作为模板参数 分配方法是分配器的一部分 allocate允许返回用户定义类型的对象,该对象“充当指向已分配数据的指针”。让我们称它为我的指针 my_指针应仅满足空指针和随机访问迭代器的要求。所有其他要求都是可选的。根据标准,我们可能无法将我的\u指

我最近试图学习libstdc++源代码(gcc7.2),但感到困惑。可能我错过了一些重要的东西,但是我开始认为不可能实现<>强> Basic字符串St/ <强>类,完全符合C++标准。p> 这是我面临的一个问题

  • basic_string应该能够接受自定义分配器类作为模板参数
  • 分配方法是分配器的一部分
  • allocate允许返回用户定义类型的对象,该对象“充当指向已分配数据的指针”。让我们称它为我的指针
  • my_指针应仅满足空指针随机访问迭代器的要求。所有其他要求都是可选的。根据标准,我们可能无法将我的\u指针转换为图表*类型(另一个基本\u字符串模板参数),因为它是可选的
  • 另一方面,const CharT*c_str()方法应该作为标准的一部分来实现,因此我们必须知道如何进行此转换
  • 第4项和第5项相互冲突,我不知道如何解决。 希望你能帮我弄明白


    谢谢大家!

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

  • 给定
    基本字符串
    图表
    分配器{u特征为
    分配器::指针
    分配器::值{u类型*

    • 在前一种情况下,给定一个
      Allocator::pointer
      p
      *p
      Allocator::value\u type&

    • 在后一种情况下,一切都是琐碎的

  • Allocator::pointer
    是一个,它要求给定一个连续迭代器
    q
    *(q+n)==*(addressof(*q)+n)

  • 给定一个
    分配器
    a
    a.allocate(n)
    返回一个
    分配器::指针

  • 把所有东西结合在一起,就意味着这总是正确的

    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); }
        // ...
    };
    
    模板
    类基本字符串
    {
    typename std::分配器\特性::指针\数据;
    // ...
    公众:
    charT*c_str(){return std::addressof(*_data);}
    // ...
    };
    

    其中
    \u data
    可能存储以前调用
    Allocator::allocate

    的结果我变得更聪明的一天可能会到来,但不是今天。谢谢你的帮助!你的回答很有用。