gpt4 book ai didi

C++11 和 [17.5.2.1.3] 位掩码类型

转载 作者:可可西里 更新时间:2023-11-01 18:38:00 34 4
gpt4 key购买 nike

标准允许在整数类型、enumstd::bitset 之间进行选择。

鉴于这些选择,为什么库实现者会使用一个而不是另一个?

恰当的例子,llvm 的 libcxx 似乎使用了(至少)这些实现选项中的两个的组合:

ctype_base::mask 使用整数类型实现: <__locale>

regex_constants::syntax_option_type 是使用 enum + 重载运算符实现的: <regex>

gcc 项目的 libstdc++ 使用了所有三个:

ios_base::fmtflags 使用枚举 + 重载运算符实现: <bits/ios_base.h>

regex_constants::syntax_option_type是使用整数类型实现的, regex_constants::match_flag_type 是使用 std::bitset
实现的两者: <bits/regex_constants.h>

据我所知,gdb 无法“检测”这三个选项中任何一个的位域性,因此增强调试不会有区别。

enum 解决方案和整数类型解决方案应始终使用相同的空间。 std::bitset 似乎不能保证 sizeof(std::bitset<32>) == std::uint32_t 所以我看不出 std::bitset 有什么特别吸引人的地方。

enum 解决方案似乎类型安全性稍差,因为掩码的组合不会生成枚举器。

严格来说,上述内容是关于 n3376 而不是 FDIS(因为我无权访问 FDIS)。

在此领域的任何可用启发将不胜感激。

最佳答案

真正令人惊讶的是,该标准将其限制为只有三种选择。为什么类类型不应该被接受?不管怎样……

  • 整数类型是最简单的选择,但它们缺乏类型安全性。非常古老的遗留代码将倾向于使用它们,因为它们也是最古老的。
  • 枚举类型安全但麻烦,在 C++11 之前,它们倾向于固定为 int 的大小和范围。 .
  • std::bitset bitset<5> 可能具有更多的类型安全性和 bitset<6>是不同的类型,加法是不允许的,但除此之外是不安全的,就像整数类型一样。如果他们允许 derived 来自 std::bitset<N> 的类型,这就不是问题了。 .

很明显enum s 是理想的选择,但经验证明类型安全确实是不必要的。所以他们给了实现者一个骨头,让他们走更容易的路。那么,简短的回答是懒惰导致实现者选择int。或 bitset .

派生自 bitset 的类型有点奇怪不允许,但这确实是小事。

子句提供的主要规范是在这些类型上定义的一组操作(即按位运算符)。

关于C++11 和 [17.5.2.1.3] 位掩码类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9857239/

34 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com