C++ 分配器可以是最终的吗?
Can a C++ allocator be final?
cppreference page for the Allocator requirement 并没有说 Allocator 必须是可继承的,即它没有说 Allocator 必须是可继承的不是最终的。
但是,在许多库中,分配器是私有继承的,以利用无状态分配器的空基 class 优化。例如:
template <typename T, typename A = std::allocator<T>>
class Dummy_vector :private A {
// ...
A get_alloc() const
{
return static_cast<A>(*this);
}
// ...
};
如果 A
是最终的,则此实现中断。
Allocator 可以是最终的吗?我错过了什么?或者这样的实现应该包括最终 Allocators?
的特殊代码
(注意:"special code for final Allocators," 我的意思是这样的:
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
};
)
这确实是个问题。另见 C++ Standard Library Defect Report 2112。该标准不要求可以派生分配器类型。但是,该标准也没有指定实现派生自分配器类型。因此,共识似乎是,这被认为是实现的错误,因为没有检查分配器类型是否可以从…
cppreference page for the Allocator requirement 并没有说 Allocator 必须是可继承的,即它没有说 Allocator 必须是可继承的不是最终的。
但是,在许多库中,分配器是私有继承的,以利用无状态分配器的空基 class 优化。例如:
template <typename T, typename A = std::allocator<T>>
class Dummy_vector :private A {
// ...
A get_alloc() const
{
return static_cast<A>(*this);
}
// ...
};
如果 A
是最终的,则此实现中断。
Allocator 可以是最终的吗?我错过了什么?或者这样的实现应该包括最终 Allocators?
的特殊代码(注意:"special code for final Allocators," 我的意思是这样的:
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
};
)
这确实是个问题。另见 C++ Standard Library Defect Report 2112。该标准不要求可以派生分配器类型。但是,该标准也没有指定实现派生自分配器类型。因此,共识似乎是,这被认为是实现的错误,因为没有检查分配器类型是否可以从…