Мне интересно, почему std::bitset::reference
и std::vector<bool>::reference
задает явный деструктор (не сгенерированный компилятором). Поскольку, например, boost::dynamic_bitset::reference
, похоже, не указывает такой деструктор.Почему стандарт C++ указывает деструктор для std :: bitset :: reference?
ответ
Просто потому, что стандарт упоминает ~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>
- 1. Почему std :: bitset :: reference :: operator ~?
- 2. `std :: bitset :: reference` оператор присваивания?
- 3. Срок службы std :: bitset :: объект ссылки, созданный в std :: bitset :: operator []?
- 4. Почему std :: bitset :: size non-static
- 5. Какова производительность std :: bitset?
- 6. Было ли предложение добавить std :: bin в стандарт C++?
- 7. Инициализация C++ std :: bitset во время компиляции
- 8. Требуется ли стандарт std :: tuple_size для SFINAE?
- 9. C++ - размер std :: bitset <0>?
- 10. Почему std :: bitset разоблачает биты в стиле little-endian?
- 11. Почему деструктор не вызван исключением?
- 12. Указывает ли стандарт C++ на представление чисел с плавающей запятой?
- 13. деструктор подключаемом Std :: резьба
- 14. Использование std :: bitset для двойного представления
- 15. Используйте std :: bitset для создания двоичного файла
- 16. Эмуляция std :: bitset в CUDA
- 17. convert dynamic_bitset to std :: bitset
- 18. C++: Почему здесь называется деструктор?
- 19. C++ 14: Стандарт позволяет вычесть дельта из std :: end()?
- 20. C++: Когда и почему называется деструктор?
- 21. C++ std :: top top return reference
- 22. G ++ Undefined Reference std ::
- 23. std :: move неожиданно вызывает деструктор
- 24. C++, пустой деструктор для класса
- 25. C++ std :: vector performance [reference required]
- 26. Диапазоны испытаний битов в std :: bitset
- 27. Почему стандарт C++ поддерживает такую избыточную функцию?
- 28. Очень длинный булевский массив/std :: bitset
- 29. Использование класса enum со стандартом std :: bitset
- 30. Почему emplace_back вызывает деструктор?
Кто-то писал в 1990-е годы, и никто не предложил, чтобы изменить его с тех пор? Наверное, никакой другой причины. –