我想知道为什么std::bitset::reference
和std::vector<bool>::reference
指定了一个显式的析构函数(而不是编译器生成的析构函数)。例如,因为boost::dynamic_bitset::reference
似乎没有指定这样的析构函数。
答案 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_bitset
和boost::container::flat_set<int, Alloc>
的混合)。
</rant mode>