Почему перегружает operator& () запрещенный для классов, сохраненных в контейнерах STL?

Внезапно в этой статье ("проблема 2") я вижу оператор, что Стандарт C++ запрещает использование контейнеры STL для хранения элементов класса, если тот класс имеет перегруженное operator&().

Перегрузив operator&() может действительно быть проблематичным, но похож на "адрес по умолчанию -" оператора, может использоваться легко через ряд грязно выглядящих бросков, которые используются в boost::addressof() и, как полагают, являются портативными и стандартными-compilant.

Почему имеет перегруженное operator&() запрещенный для классов, сохраненных в контейнерах STL, в то время как boost::addressof() обходное решение существует?

7
задан Community 23 May 2017 в 12:00
поделиться

3 ответа

Не глядя на ссылки, я полагаю, трюки в boost :: addressof () были изобретены задолго до требования не перегружать унарный префикс & для объектов, которые должны храниться в контейнерах std lib.

Я смутно помню, как Пит Беккер (тогда работал в Dinkumware над реализацией их стандартной библиотеки) однажды заявил, что каждый, кто перегружает оператор адреса и ожидает, что их реализация стандартной библиотеки все еще будет работать, должен быть наказан необходимостью реализации стандартной библиотеки, которая Является ли это.

6
ответ дан 7 December 2019 в 03:13
поделиться

Стандарт был доработан в 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. Вам просто не разрешено изменять значение или тип встроенной функции.)

1
ответ дан 7 December 2019 в 03:13
поделиться

Вероятно, потому что проще просто запретить использование перегруженных классов operator & (), чем создавать функцию std :: addressof () и заменять каждое использование & в коде контейнера с ним.

2
ответ дан 7 December 2019 в 03:13
поделиться
Другие вопросы по тегам:

Похожие вопросы: