Предоставляются ли какие-либо перегрузки операторов C ++ автоматически на основе других?

Скажи я пишу int Обертка и необходимо обеспечить перегрузку каждого оператора. Должен ли автор перечислять каждый из них, или он может автоматически генерировать что-либо на основе того, что предоставил автор? Может ли компилятор выводить какие-либо новые автоматически определенные операторы из существующих?

Если я определю operator==это дает мне operator!= автоматически? Или наоборот?

Если я определю operator++()я получу operator++(int) бесплатно? Или наоборот?

Как насчет += тип бизнеса? Может ли он объединить существующие определения operator+ с operator= чтобы генерировать operator+=? Теоретически это должно быть возможно, но так ли это?

Тот же вопрос для >= в <и т. д., или я должен полностью перечислить определения >,>,>=,<=?

3

Решение

В базовом языке различные операторы независимы. Некоторые из них определены в терминах других, но если не удается разрешить перегрузку для вызова оператора, то нет попытки выразить этот вызов в терминах других операторов. Когда это желательно, это может быть легко выражено программистом (наоборот, отключение такого механизма, вероятно, будет более трудным).

Существует множество перегрузок реляционных операторов в std::rel_ops этот клиентский код может использовать, определенный в терминах < а также ==,

Вы можете легко написать mixin-класс, который предоставляет реляционные операторы в терминах < а также ==или с точки зрения трехзначного compare функция. Это была первоначальная мотивация для Любопытно повторяющийся шаблон, называется Трюк Бартона-Накмана.

4

Другие решения

Нет.

C ++ не имеет правил вывода на базовом языке, так что даже определяющее + это не предполагает ничего о +=… они просто (насколько говорит язык) совершенно не связаны.

Считайте, что << (Оператор сдвига влево) в стандартной библиотеке был перегружен, что означает «вывод в поток» … только из-за внешнего вида, разумного приоритета и ассоциативности.

2