C++ Can a C++;分配器是最终的吗?
没有说分配器必须是可继承的,也就是说,它没有说分配器不能是最终的 然而,在许多库中,分配器是私有继承的,以利用无状态分配器的空基类优化。例如:C++ Can a C++;分配器是最终的吗?,c++,inheritance,memory-management,final,allocator,C++,Inheritance,Memory Management,Final,Allocator,没有说分配器必须是可继承的,也就是说,它没有说分配器不能是最终的 然而,在许多库中,分配器是私有继承的,以利用无状态分配器的空基类优化。例如: template <typename T, typename A = std::allocator<T>> class Dummy_vector :private A { // ... A get_alloc() const { return static_cast<A>(*th
template <typename T, typename A = std::allocator<T>>
class Dummy_vector :private A {
// ...
A get_alloc() const
{
return static_cast<A>(*this);
}
// ...
};
)这确实是个问题。另见。该标准不要求可以从中派生分配器类型。但是,该标准也没有指定实现派生自分配器类型。因此,大家一致认为这是实现的错误,因为没有检查分配器类型是否可以派生自…实际上,我想最好将其视为标准库实现中的一个bug…谢谢!我同意标准包含一个逻辑错误,关于“一个分配器不能是非类类型……因此,总是有可能从分配器创建一个派生类”,因为它不能考虑最终。然后,标准库实现是无辜的;-)好啊无论如何,当我编写容器时,我会检查
final
。@L.F.我编辑了我的答案;我删除了我在标准中称之为bug的部分。我忽略了缺陷报告已标记为使用C++14解决。讨论会使我得出这样的结论:至少是因为C++ 14,问题是实现而不是规范问题。@ L.F.从C++ 20开始,属性应该消除在这种情况下从用户提供的类型派生的原因,而这样做所带来的所有问题…
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
};