【发布时间】:2018-05-13 03:28:33
【问题描述】:
Allocator concept 和 std::allocator_traits 并没有说明allocate 是否会抛出。
那么当我使用分配器编写容器时,如何知道是检查返回类型还是使用catch?
【问题讨论】:
Allocator concept 和 std::allocator_traits 并没有说明allocate 是否会抛出。
那么当我使用分配器编写容器时,如何知道是检查返回类型还是使用catch?
【问题讨论】:
您参考的页面的要求部分中的表格提供了足够的信息,什么时候可以抛出异常,什么时候不能抛出异常。下面是分配器可能抛出异常时的引用。
a.allocate(n)分配适合T类型的 n 个对象的存储空间,但不构造它们。可能会抛出异常。
那里没有描述抛出什么类型的异常,并且可能取决于实现。在 STL 中一般为std::bad_alloc。
【讨论】:
是的,它可能会抛出。例外是std::bad_alloc,因为它使用传递给它的allocator,而std::allocator 将抛出std::bad_alloc。
在你引用的页面中介绍了两种情况:
- 调用 a.allocate(n)
- 另外传递内存位置提示提示。如果可能,调用 a.allocate(n, hint)。如果不可能(例如 a 没有两个参数的成员函数 allocate()),则调用 a.allocate(n)
所以基本上你可以转向这个:
【讨论】: