Скажи я пишу int
Обертка и необходимо обеспечить перегрузку каждого оператора. Должен ли автор перечислять каждый из них, или он может автоматически генерировать что-либо на основе того, что предоставил автор? Может ли компилятор выводить какие-либо новые автоматически определенные операторы из существующих?
Если я определю operator==
это дает мне operator!=
автоматически? Или наоборот?
Если я определю operator++()
я получу operator++(int)
бесплатно? Или наоборот?
Как насчет +=
тип бизнеса? Может ли он объединить существующие определения operator+
с operator=
чтобы генерировать operator+=
? Теоретически это должно быть возможно, но так ли это?
Тот же вопрос для >=
в <
и т. д., или я должен полностью перечислить определения >
,>
,>=
,<=
?
В базовом языке различные операторы независимы. Некоторые из них определены в терминах других, но если не удается разрешить перегрузку для вызова оператора, то нет попытки выразить этот вызов в терминах других операторов. Когда это желательно, это может быть легко выражено программистом (наоборот, отключение такого механизма, вероятно, будет более трудным).
Существует множество перегрузок реляционных операторов в std::rel_ops
этот клиентский код может использовать, определенный в терминах <
а также ==
,
Вы можете легко написать mixin-класс, который предоставляет реляционные операторы в терминах <
а также ==
или с точки зрения трехзначного compare
функция. Это была первоначальная мотивация для Любопытно повторяющийся шаблон, называется Трюк Бартона-Накмана.
Нет.
C ++ не имеет правил вывода на базовом языке, так что даже определяющее +
это не предполагает ничего о +=
… они просто (насколько говорит язык) совершенно не связаны.
Считайте, что <<
(Оператор сдвига влево) в стандартной библиотеке был перегружен, что означает «вывод в поток» … только из-за внешнего вида, разумного приоритета и ассоциативности.