我想知道为什么std::bitset::reference
并std::vector<bool>::reference
指定一个显式析构函数(不是编译器生成的)。因为,例如,boost::dynamic_bitset::reference
似乎没有指定这样的析构函数。
1 回答
仅仅因为标准提到~reference()
作为析构函数,并不意味着它必须由用户提供为无操作{}
(libstdc++和SGI/STL就是这样做的)。它也可以被用户声明为=default
,甚至隐式定义(这就是libc++的做法)。无论如何,可以更新标准以删除对析构函数的明确提及。您可以提交编辑更改(我认为这不值得提出真正的提案)。
正如@BoPersson 在评论中所指出的,std::bitset
它是标准库的一个非常古老的组件。它的许多特性(来自无符号整数的隐式构造函数,成员而不是非成员operator==
)早于 1998 年的语言标准化。无耻的插件:参见例如这个 Q&A以了解更多关于这是如何出现的讨论,以及这个 Q&A了解为什么它可能解决此问题时中断代码。
<rant mode>
摆脱遗留问题的最好方法std::bitset
是彻底打破namespace experimental
. 优选地,这也将解决 的混合抽象std::bitset
,同时尝试成为 的空间优化版本array<bool>
以及set<int>
. 理想情况下,会有一个提供这些抽象的 abool_array<N>
和a 提案。bounded_int_set<N>
类似地,可以定义bool_vector<Alloc>
(目前称为vector<bool, Alloc>
)和int_set<Alloc>
(目前是boost::dynamic_bitset
和的混合体)。boost::container::flat_set<int, Alloc>
</rant mode>