相关疑难解决方法(0)

为什么STL容器中的swap成员函数没有声明为noexcept?

N3797开始,swap除非另有说明,否则C++标准要求容器函数不抛出任何异常[container.requirements.general](23.2.1§10).

  • 为什么swap指定的成员函数不抛出未声明noexcept

同样的问题适用于专门的非成员swap重载.

c++ swap noexcept c++11

13
推荐指数
2
解决办法
506
查看次数

为什么在分配器中允许`propagate_on_container_swap == false`,何时可能导致未定义的行为?

注:最初由问马特·麦克纳布评论为什么能交换标准库容器在C++ 11(包括分配器)是有问题的?.


标准(N3797)说,如果progagate_on_container_swap内部分配器std::false_type它会产生不确定的行为,如果涉及的两个分配器不比较平等的.

  • 为什么标准允许这样的结构似乎不仅仅是危险的?

23.2.1p9 一般集装箱要求 [container.requirements.general]

如果 allocator_traits<allocator_type>::propagate_on_container_swap::valuetrue,那么也应该使用对非成员的未经授权的呼叫来交换a和的分配器.否则,它们不应被交换,并且行为是未定义的,除非.bswapa.get_allocator() == b.get_allocator()

c++ allocator language-lawyer c++11

11
推荐指数
1
解决办法
500
查看次数

标签 统计

c++ ×2

c++11 ×2

allocator ×1

language-lawyer ×1

noexcept ×1

swap ×1