C&C++   发布时间:2022-04-03  发布网站:大佬教程  code.js-code.com
大佬教程收集整理的这篇文章主要介绍了c – 为什么std :: unordered_map :: count上没有`noexcept`说明符?大佬教程大佬觉得挺不错的,现在分享给大家,也给大家做个参考。
我正在阅读关于std :: unordered_map的 C++ reference page.该
emptysize方法不是合格的,但不是 count.

我不认为它应该算数.

我错过了什么吗?

解决方法

因为要求如此说:

count返回与特定键匹配的元素数,并且对于任何无序关联容器类型X(实例化std :: unordered_maps是此类容器),对X :: key_type类型的对象评估键比较

n3337 23.2.5 / 5 [unord.req]

对于无序映射,X :: key_type被定义为其模板参数列表的一部分:

template<
    class Key,//    ^^^ member type key_type set from this parameter
    class T,class Hash = std::hash<Key>,class KeyEqual = std::equal_to<Key>,//    ^^^^^^^^ member type key_equal set from this parameter
    class Allocator = std::allocator< std::pair<const Key,T> >
> class unordered_map;

我可以在key_type上找到的唯一约束也适用于value_type:

n3337 23.2.5 / 9 [unord.req] 2

所以我们只需要知道表96中对value_type的要求,它指定了Container的要求.在第一行中,我们有:

n3337,表963

其中X再次是Container的类型,T是它存储的对象的类型.可破坏对象不允许抛出析构函数.这是他们唯一的要求.

n3337,表24

(你是符合Destructible要求的T型对象)

因此,对unordered_map的密钥比较函数提供的抛出保证没有限制,因此不保证std :: equal_to提供的operator ==操作实现所需的行为.密钥本身没有任何这样的限制,因此:允许比较函数抛出,并且允许使用比较函数的任何函数抛出. count需要使用与提供的键匹配的键和比较函数来计算存储的值,因此它可能会抛出.

clear可能是noexcept,因为标准禁止抛出析构函数

17.6.4.8 / 1,24 [res.on.functions]

由于唯一依赖于客户端的代码清除执行可能不会抛出异常,并且实现不需要,它可能已被标记为noexcept

笔记:

1. n4140标准草案(接近c 14)似乎根本没有改变这一条款.

2. n4140保留这一措辞,从第9条移至第10条.

3.容器要求也列在N4140的表96中,并列出了T为Erasable的要求,它也对操作符没有限制==

4.该条款的措辞在N4140中没有改变.

大佬总结

以上是大佬教程为你收集整理的c – 为什么std :: unordered_map :: count上没有`noexcept`说明符?全部内容,希望文章能够帮你解决c – 为什么std :: unordered_map :: count上没有`noexcept`说明符?所遇到的程序开发问题。

如果觉得大佬教程网站内容还不错,欢迎将大佬教程推荐给程序员好友。

本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。