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

标签 c++ inheritance memory-management final allocator

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

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

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的特殊代码?

(注意:“最终分配器的特殊代码”,我的意思是这样的:

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 .该标准不要求可以派生分配器类型。但是,该标准也没有指定实现派生自分配器类型。因此,共识似乎是,这被认为是实现的错误,因为没有检查分配器类型是否可以从......

关于c++ - C++ 分配器可以是最终的吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55310209/

相关文章:

c++ - "string_literal"当编译器选择函数的重载版本时,解析为 bool 而不是 std::string

C++ 进程终止,状态为 -1073741819

c++ - 如何尝试读取未分配的内存

不同包中的java复制构造函数

c++ - 为什么这运行良好? (访问范围外变量的地址)

python - numpy: bool 索引和内存使用

c++ - 从两个绝对路径获取相对路径

C++:从命令行链接时遇到问题

java - 如何避免从父类(super class)进行转换?

继承中的 C++ 复制构造函数