Страница cpreference для требования Allocator не говорит о том, что 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?
(Примечание: под «специальным кодом для окончательного 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
};
)