为什么C++标准为std :: bitset :: reference指定了析构函数?

Vin*_*ent 5 c++ destructor reference c++11 std-bitset

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

Tem*_*Rex 3

仅仅因为标准提到了~reference()析构函数,并不意味着它必须由用户提供为无操作{}(这就是libstdc++SGI/STL的做法)。它也可以由用户声明为=default,甚至可以隐式定义(这就是libc++的做法)。无论如何,可以更新标准以删除对析构函数的明确提及。您可以提交编辑更改(我认为这不值得提出真正的提案)。

正如 @BoPersson 在评论中指出的那样,std::bitset它是标准库的一个非常古老的组件。它的许多功能(来自无符号整数的隐式构造函数、成员而不是非成员operator==)早于 1998 年的语言标准化。无耻的插件:请参阅此问答以了解更多关于这种情况如何发生的讨论,以及此问答以了解为什么会出现这种情况当这个问题被修复时破坏代码。

<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_bitsetboost::container::flat_set<int, Alloc>

</rant mode>