为什么std :: vector :: get_allocator()按值返回?

时间:2013-04-06 14:05:02

标签: c++ allocator

令我惊讶的是,尝试将std::vector::get_allocator()与不可复制的分配器一起使用时出错。为什么std::vector::get_allocator()按值返回而不是按引用返回?

template<typename T>
class nc_allocator {
public:
    using value_type = T;

    nc_allocator(nc_allocator const&) = delete;
    nc_allocator& operator=(nc_allocator const&) = delete;

    // Other required members.
};

std::vector<int, nc_allocator<int>> v;
// boom: use of deleted function
//           'nc_allocator<T>::nc_allocator(const nc_allocator<T>&) [with T = int]'
v.get_allocator();

2 个答案:

答案 0 :(得分:7)

  

尝试将std::vector::get_allocator()与不可复制的分配器一起使用时出错。

标准禁止您这样做。 17.6.3.5中的分配器要求表明分配器应是可复制的。

X a1(a);         Shall not exit via an exception.
                 post: a1 == a
X a1(move(a));   Shall not exit via an exception.
                 post: a1 equals the prior value
                 of a.

因此,按值返回是返回分配器的正确方法,涉及标准定义的分配器要求。

我不确定为什么这是一项要求,但如果允许使用不可复制的分配器,那么空基础优化就不会再有效了。

答案 1 :(得分:1)

标准只是如此指示:

  

[C++11: 23.2.1/7]: [..] 在本条款中定义的所有容器类型中,   成员get_allocator()返回用于构造容器的分配器的副本,或者,如果已替换该分配器,则返回最新替换 [..]

的副本

我怀疑@ Vaughn在他的假设中是正确的,即分配器被用作“句柄”。

通过非常松散的比喻,您是否会编写一个不可复制的仿函数用于标准算法?