10

令我惊讶的是,在尝试使用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();
4

2 回答 2

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.

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

我不确定为什么这是一个要求,但如果允许不可复制的分配器,空基优化将不再起作用。

于 2013-04-06T14:12:53.980 回答
1

标准只是这样规定:

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

我怀疑@Vaughn 的假设是正确的,即分配器应该用作“句柄”。

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

于 2013-04-06T14:15:30.790 回答