C++ 为什么get_分配器返回副本而不是引用

C++ 为什么get_分配器返回副本而不是引用,c++,c++11,stdvector,allocator,C++,C++11,Stdvector,Allocator,我使用的是一个自定义分配器,它内部有一个小的简单状态。当我将它与std::vector一起使用时,我惊讶地发现get_allocator()实际上会将副本返回给分配器 这里记录了这一点: 这是什么原因 我可以想象的一个原因是get\u分配器是const成员,我不介意获取对分配器的const引用。除此之外,内部分配器可以声明为mutable 我错过了什么吗? 是否有解决办法让std::vector的内部分配器检查分配器的状态? 注意:如果分配器是有状态的,那么也有可能一路使用引用?与std::ve

我使用的是一个自定义分配器,它内部有一个小的简单状态。当我将它与
std::vector
一起使用时,我惊讶地发现
get_allocator()
实际上会将副本返回给分配器

这里记录了这一点:

这是什么原因

我可以想象的一个原因是
get\u分配器
const
成员,我不介意获取对分配器的
const
引用。除此之外,内部分配器可以声明为
mutable

我错过了什么吗? 是否有解决办法让
std::vector的内部分配器检查分配器的状态?


注意:如果分配器是有状态的,那么也有可能一路使用引用?与std::vector类似,有状态分配器应该在保留其状态的情况下进行复制

例如,当您传递一个映射的分配器时,它会反弹到另一个分配器类型,但仍然保留您传递给它的状态

或者两个不同的容器共享分配器状态,但它们具有不同的分配器实例


通常,您的分配器具有指向您的状态的指针。将指向您的状态的指针设为分配器构造函数的参数,并将其作为容器构造函数的参数传递。

有状态分配器应该复制并保留其状态

例如,当您传递一个映射的分配器时,它会反弹到另一个分配器类型,但仍然保留您传递给它的状态

或者两个不同的容器共享分配器状态,但它们具有不同的分配器实例


通常,您的分配器具有指向您的状态的指针。将指向您的状态的指针设为分配器构造函数的参数,并将其作为容器构造函数的参数传递。

为什么您不能检查副本的状态?@t.C.,我可以,(这是一个很好的观点),但我是通过地址来识别实际的分配器的,但我还是很惊讶我必须制作一个副本来检查状态。“通过地址识别实际分配器”-为什么?分配器(通常)是向量中的一个数据成员,其地址是向量地址的一个简单函数。”如果分配器是有状态的“-典型的分配器状态是进行分配的共享内存区域或其他区域的地址。分配器应该是可以自由复制的。为什么你不能检查副本的状态?@t.C.,我可以,(这是一个很好的观点),但我是通过地址来识别实际分配器的,但我仍然很惊讶,我必须制作副本来检查状态。“通过地址识别实际分配器”-为什么?分配器(通常)是向量中的一个数据成员,其地址是向量地址的一个简单函数。“如果分配器是有状态的,那么这种可能性”——典型的分配器状态是发生分配的共享内存区域或其他区域的地址。分配器应该是可自由复制的。非常详细的答案描述了事物的预期状态。非常详细的答案描述了事物的预期状态。