是否仍然可以自定义 STL 载体的"reference"类型?
Is it still possible to customize STL vector's "reference" type?
是否可以自定义std::vector
的reference
。在C++11之前,通过Allocator
模板参数似乎是可能的。但现在不行了?
根据文献,http://en.cppreference.com/w/cpp/container/vector,reference
现在总是value_type
,而value_type
总是模板参数T
。
即使使用CCD_ 8似乎也是不可能的,http://en.cppreference.com/w/cpp/memory/allocator_traits
有解决办法吗?
如果不是,这是否意味着如果我想拥有一个基于分配器的特殊reference
类型,我必须专门化整个std::vector
,并可能复制它的所有功能?
如果是这样的话,一般来说,所有这些约束的逻辑是什么?强制用户使用std::vector<T, A>
始终管理常规内存(其中value_type = T
、reference = T&
和pointer = T*
?)
注意:我知道std::vector<bool>
的争议。然而,这有点笼统,因为原则上我需要一个自定义的std::vector<RegularType, special_allocator<RegularType>>
,主要用于控制operator[](int)
向特殊代理对象的返回类型。
具体实现:我正在查看GCC 6.3.1的stdlib源代码,在std_vector.h
中可以读取:
template<typename _Tp, ...>
class vector : ...{
...
public:
typedef typename _Alloc_traits::reference reference;
};
这似乎表明仍然可以通过CCD_ 19(_traits
?)指定引用类型。
根据文档,allocator
或allocator_traits
不需要具有reference
类型。另外,我不知道如何自定义这种类型。
GCC是否未遵守标准?或者只是间接地将allocator_traits<Allocator>::reference
强制为allocator_traits<Allocator>::value_type&
?
如果是这样,那么一般来说,所有这些约束的逻辑是什么?
目的是停止承诺C++无法实现的东西。
早在C++98/03时代,人们就认为代理类型、专用引用等确实可以与标准库容器和算法一起使用。当C++11出现时,已经非常清楚。。。不,他们真的不能。或者至少,不具有与实际语言引用相同的语义。
考虑到这一点,C++11删除了许多不再合理的定制点。typedef保留了下来,但主要是为了向后兼容性。
这似乎表明仍然可以通过分配器(_traits?)指定引用类型。
不,不是。这是libstdc++中的一个错误;reference
是现在容器需要的value_type&
。allocator_traits
没有reference
自定义点。
- ArduinoJson 6.15.2:JsonObject没有命名类型
- 防止主数据类型C++的隐式转换
- 大量序列中核苷酸类型的快速计数
- 如何从C++中的依赖类型中获得它所依赖的类型
- 有关插入适配器的错误。[错误]请求从 'back_insert_iterator<vector<>>' 类型转换为非标量类型
- 是否可以初始化不可复制类型的成员变量(或基类)
- 如何获取std::result_of函数的返回类型
- 从父命名空间重载类型
- 如果C++类在类方法中具有动态分配,但没有构造函数/析构函数或任何非静态成员,那么它仍然是POD类型吗
- 我想将一个对T类型的非常量左值引用绑定到一个T类型的临时值
- Openssl 1.1.1d无效使用不完整的类型"struct dsa_st"
- 访问者访问变体并返回不同类型时出错
- C++返回类型 T(&)[] 与使用 reference = T(&)[] 作为返回类型
- C++ 'Undefined Reference'具有多种数据类型的模板类
- 是否仍然可以自定义 STL 载体的"reference"类型?
- 如果我创建一个修改值的迭代器,静态成员"reference"应该是什么类型?
- 将特征类型与 boost::bind 一起使用是否会自动违反 Eigen 的"only pass by reference"规则?
- 获取模板类型的基类型(移除const/reference等)
- 引用(类型 &)"non-const lvalue reference to type cannot bind"错误,但指针(类型 *)不错误
- 错误:从类型为"std::vector:<bool>:reference {aka std::_Bit_reference}"的右值初始化类型为"bool&"的非常量引用无效