令我惊讶的是,尝试将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();
答案 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在他的假设中是正确的,即分配器被用作“句柄”。
通过非常松散的比喻,您是否会编写一个不可复制的仿函数用于标准算法?