allocator :: get_deleter()应该是const限定的吗?

时间:2018-03-13 11:21:28

标签: c++ const api-design allocator

我试图为我的无锁分配器类模板提供get_deleter()(代码为here)。删除器就像

template <typename T>
struct deleter {
  allocator<T>& alloc;
  void operator()(T* p) const noexcept {
    p->~T();
    alloc.deallocate(p);
  }
};

请注意,alloc不应为const,因为deallocate()不是const,与std::allocator::deallocate()一致。现在,我不确定我的allocator::get_deleter()是否应为const。困境如下:

1。成为const的基本原理:该方法本身并不修改*this,并且是线程安全的(另请参阅Does const mean thread-safe in C++11?)。

2。不是const的基本原理:该方法返回deleter,可用于修改*this。如果方法为const_cast(),也可以避免使用const

有任何建议或想法吗?就个人而言,我赞成const

1 个答案:

答案 0 :(得分:1)

不要const_cast<allocator &>(*this)

您不知道是否有人会有const allocator<...>值并获得未定义的行为。即使你没有,你也在谎言const它是如何形成的。

allocator::get_deleter 在没有const的情况下不能const_cast,因此不应该。< / p>

See it live