【问题标题】:Why does the C++ standard specifies a destructor for std::bitset::reference?为什么 C++ 标准为 std::bitset::reference 指定析构函数?
【发布时间】:2016-03-25 09:21:35
【问题描述】:

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

【问题讨论】:

  • 有人在 1990 年代写了这个,从那以后就没有人提议改变它了?我猜没有其他原因。

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


【解决方案1】:

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

正如@BoPersson 在 cmets 中所指出的,std::bitset 是标准库中一个非常古老的组件。它的许多特性(来自无符号整数的隐式构造函数,成员而不是非成员 operator==)早于 1998 年的语言标准化。无耻插件:参见例如this Q&A 了解更多关于这可能是如何出现的讨论,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>

【讨论】:

    猜你喜欢
    • 2014-11-08
    • 1970-01-01
    • 1970-01-01
    • 2020-06-13
    • 2019-02-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-10-06
    相关资源
    最近更新 更多