2015-12-18 2 views
5

Мне интересно, почему std::bitset::reference и std::vector<bool>::reference задает явный деструктор (не сгенерированный компилятором). Поскольку, например, boost::dynamic_bitset::reference, похоже, не указывает такой деструктор.Почему стандарт C++ указывает деструктор для std :: bitset :: reference?

+8

Кто-то писал в 1990-е годы, и никто не предложил, чтобы изменить его с тех пор? Наверное, никакой другой причины. –

ответ

3

Просто потому, что стандарт упоминает ~reference() как деструктор, не означает, что он должен быть удобным для пользователя при условии, как не-оп {} (который, как libstdc++ и SGI/STL сделать это). Он также может быть объявлен пользователем как =default, или даже левым определением неявно (как это делает libc++). Несмотря на это, стандарт может быть обновлен, чтобы это явное упоминание о удалении деструктора. Вы можете внести изменения в редакцию (я не думаю, что это требует реального предложения).

Как отметил @BoPersson в комментариях, 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_bitset и boost::container::flat_set<int, Alloc>).

</rant mode>

Смежные вопросы