Внезапно в этой статье ("проблема 2") я вижу оператор, что Стандарт C++ запрещает использование контейнеры STL для хранения элементов класса, если тот класс имеет перегруженное operator&()
.
Перегрузив operator&()
может действительно быть проблематичным, но похож на "адрес по умолчанию -" оператора, может использоваться легко через ряд грязно выглядящих бросков, которые используются в boost::addressof()
и, как полагают, являются портативными и стандартными-compilant.
Почему имеет перегруженное operator&()
запрещенный для классов, сохраненных в контейнерах STL, в то время как boost::addressof()
обходное решение существует?
Не глядя на ссылки, я полагаю, трюки в boost :: addressof ()
были изобретены задолго до требования не перегружать унарный префикс &
для объектов, которые должны храниться в контейнерах std lib.
Я смутно помню, как Пит Беккер (тогда работал в Dinkumware над реализацией их стандартной библиотеки) однажды заявил, что каждый, кто перегружает оператор адреса и ожидает, что их реализация стандартной библиотеки все еще будет работать, должен быть наказан необходимостью реализации стандартной библиотеки, которая Является ли это.
Стандарт был доработан в 1998 году с исправлениями в 2003 году, тогда как boost :: addressof
датируется началом 2002 года.
Более того, неясно, является ли addressof
ответ. Перегрузки operator & ()
указывают на то, что необработанных указателей следует избегать. Элемент Allocator :: address
обеспечивает лучший интерфейс для перехода от Allocator :: reference
к Allocator :: pointer
, так что в целом вы должны иметь возможность чтобы эффективно ввести оператор и переопределение
в класс с хорошим поведением и настраиваемым распределителем.
Учитывая, что ссылки делают почти все, что делают указатели, а интерфейс Allocator абстрагирует все остальное, не должно быть необходимости в необработанных указателях.
Удобство для разработчиков библиотеки не должно быть проблемой. Плохо определенная семантика Allocator :: pointer
является проблемой, и то, что я читал до сих пор в C ++ 0x, не проясняет это.
C ++ 0x удаляет любое упоминание о operator &
из CopyConstructible, и, кроме того, не требует ничего - Constructible для аргументов контейнера - пользователь может придерживаться emplace
. Даже вектор
требует только Destructible, хотя я полагаю, что на самом деле использование insert
или erase
потребует больше.
(Обратите внимание, что при самом строгом чтении перегрузки не запрещены в C ++ 03. Вам просто не разрешено изменять значение или тип встроенной функции.)
Вероятно, потому что проще просто запретить использование перегруженных классов operator & (), чем создавать функцию std :: addressof () и заменять каждое использование & в коде контейнера с ним.