C ++分配器可以是最终的吗?

时间:2019-03-23 03:03:16

标签: c++ inheritance memory-management final allocator

cppreference page for the Allocator requirement并没有说 Allocator 必须是可继承的,也就是说,它没有说 Allocator 不能是最终的。

但是,在许多库中,分配器是私有继承的,以利用无状态分配器的空基类优化。例如:

template <typename T, typename A = std::allocator<T>>
class Dummy_vector :private A {
    // ...
    A get_alloc() const
    {
        return static_cast<A>(*this);
    }
    // ...
};

如果A是最终的,则此实现会中断。

分配器可以是最终版本吗?我错过了什么?还是应该为最终的 Allocator 提供特殊的代码?

(注意:通过“用于最终 Allocator s的特殊代码”,我的意思是这样的:

template <
    typename T,
    typename A = std::allocator<T>,
    bool = std::is_final<A>
>
class Dummy_vector :private A {
    // version for nonfinal allocators
    // ...
    A get_alloc() const
    {
        return static_cast<A>(*this);
    }
    // ...
};

template <typename T, typename A>
class Dummy_vector<T, A, true> {
    // special version for final allocators
};

1 个答案:

答案 0 :(得分:2)

这确实是一个问题。另请参见C++ Standard Library Defect Report 2112。该标准不要求可以派生分配器类型。但是,该标准也未指定实现是从分配器类型派生的。因此,共识似乎是,如果不检查分配器类型是否可以从……派生出来,那将被视为实现的错误。