5

我想知道为什么std::bitset::referencestd::vector<bool>::reference指定一个显式析构函数(不是编译器生成的)。因为,例如,boost::dynamic_bitset::reference似乎没有指定这样的析构函数。

4

1 回答 1

3

仅仅因为标准提到~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>

于 2015-12-28T19:08:27.143 回答