C++ 命名要求: 可擦除 (Erasable) (C++11 起)
指定给定分配器 (Allocator)可以销毁该类型的对象。
如果给定以下条件,类型 T 可从容器 X 中擦除,其中 X 的 value_type 与 T 相同:
A
分配器类型m
A
类型的左值p
容器准备的T*
类型指针
其中 X::allocator_type 与 std::allocator_traits<A>::rebind_alloc<T>
相同。
以下表达式格式良好
std::allocator_traits<A>::destroy(m, p);
如果 X 不是分配器感知的或是一个 std::basic_string 特化,则该术语的定义如同 A 是 std::allocator<T>,但不需要创建分配器对象,并且不会实例化 std::allocator 的用户定义特化。
备注
所有标准库容器都要求其元素类型满足 可擦除 (Erasable)。
对于默认分配器,此要求等同于 p->~T()
的有效性,它接受具有可访问析构函数的类类型和所有标量类型,但拒绝数组类型、函数类型、引用类型和 void。 (直到 C++20)
对于默认分配器,此要求等同于 std::destroy_at(p)
的有效性,它接受具有可访问析构函数的类类型和所有标量类型,以及它们的数组。 (自 C++20 起)
尽管直到 C++23 都要求在销毁 std::basic_string 的元素时使用自定义销毁,但所有实现都只使用了默认机制。此要求已通过 P1072R10 纠正,以符合现有实践。