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

时间:2015-12-18 15:59:35

标签: c++ c++11 reference destructor std-bitset

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

1 个答案:

答案 0 :(得分:3)

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

如@BoPersson在评论中所述,std::bitset是标准库的一个非常古老的组件。它的许多特性(来自无符号整数的隐式构造函数,成员而不是非成员operator==)早于1998年的语言标准化。无耻插头:参见例如libc++有关这可能会如何产生的更多讨论,以及this Q&A解释为什么在修复此代码时可能会破坏代码的问题。

<rant mode>

std::bitset遗留下来的最佳方法是在namespace experimental中彻底解决。优选地,这也将解决std::bitset的混合抽象,其同时试图成为array<bool>的空间优化版本以及set<int>。理想情况下,会有bool_array<N>bounded_int_set<N>的提案提供这些抽象。同样,可以定义bool_vector<Alloc>(目前称为vector<bool, Alloc>)和int_set<Alloc>(目前称为boost::dynamic_bitsetboost::container::flat_set<int, Alloc>的混合)。

</rant mode>