Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/152.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ Can a C++;分配器是最终的吗?_C++_Inheritance_Memory Management_Final_Allocator - Fatal编程技术网

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
};