Если вы спрашиваете обо всех языках, тогда я не думаю, что разумно говорить о «операторе &».Маркер &
может иметь всевозможные значения на разных языках, оператор и т. Д.
Например, только в C есть два различных оператора &
(унарный адрес и двоичный битовый-и).Unary &
в C и связанных с ним языках - единственный пример, о котором я могу сразу подумать, об использовании, с которым я столкнулся, которое соответствует вашим критериям.
Однако C ++ добавляет перегрузку операторов, чтобы они могли означать все, что выкак для пользовательских классов, и, кроме того, символ &
имеет значение в объявлениях типов.В C ++ 0x маркер &&
имеет значение и в объявлениях типов.
Язык, аналогичный APL или J, может "разумно" использовать оператор &
, чтобы означать почти все, посколькуне стоит ожидать, что код на этих языках будет иметь какое-либо сходство с языками, подобными Си.Не уверен, что один из этих двух действительно использует &
или &&
.
Что означает «разумно» для перегрузки бинарного оператора &
в C ++ - дело вкуса -обычно это будет что-то, аналогичное побитовой &
, потому что значения, представленные вашим классом, могут каким-то образом рассматриваться как последовательность битов.Однако не обязательно, если это имеет смысл в данной области.Обычно довольно «неразумно» использовать перегрузку &
только потому, что &
не используется.Но если ваш класс представляет собой нечто довольно сложное в математике, и вам нужен третий бинарный оператор после +
и *
, я полагаю, вы начнете осматриваться.Если вы хотите получить что-то с более низким приоритетом, чем +
, двоичный файл &
является кандидатом.Я не могу пока думать о каких-либо структурах в абстрактной алгебре, которые хотят такого, но это не значит, что их нет.
Перегрузка operator&&
в C ++ умеренно антисоциальна, так какв незагруженной версии оператора коротких замыканий и в перегруженных версиях нет.Программисты C ++ привыкли писать выражения типа if (p && *p != 0)
, поэтому, перегружая operator&&
, вы фактически возитесь с управляющей структурой.
Перегрузка унарных operator&
в C ++ чрезвычайно антисоциальна.Это мешает людям брать указатели на ваши объекты.IIRC есть некоторые неловкие случаи, когда обычные реализации стандартных шаблонов требуют от своих параметров шаблона, что унарный operator&
приводит к указателю (или, по крайней мере, очень похожему на указатель предмету).Это не задокументировано в требованиях к аргументу, но практически или полностью неизбежно, когда разработчик библиотеки приходит к реализации шаблона.Таким образом, перегрузка наложит ограничения на использование класса, который не может быть выведен из стандарта, и для этого должна быть очень веская причина.
[Править: что я не зналкогда я писал это, но теперь знаю, что создатели шаблонов могли обойти необходимость использовать унарный operator&
с параметрами шаблона, когда стандарт не указывает, что &
делает для этого типа (т.е. все они),Вы можете делать то, что делает boost::addressof
:
reinterpret_cast<Foo*>(&reinterpret_cast<char&>(foo))
Стандарт не требует большого количества reinterpet_cast
, но, поскольку мы говорим о стандартных шаблонах, они точно знают, что он делает вреализации, и в любом случае законно интерпретировать объект как символы.Я думаю, что это гарантированно сработает - но если нет, то реализация может гарантировать, что она действительно работает, если необходимо написать полностью соответствующие стандартные шаблоны.
Но, если ваша реализация не идет на эти длины, чтобы избежать вызоваперегружен operator&
, оригинальная проблема остается.]