Должно ли возвращаемое значение бинарного оператора + перегрузка быть постоянным и может ли это помешать оптимизации?

Учитывая пример кода:

class Integer
{
    int i_;
public:
    Integer(int i) : i_(i) {}
    const Integer operator+(const Integer &arg) const { return Integer(i_ + arg.i_); }
};

Я начал задаваться вопросом, должен ли оператор +() возвращать константное целое число или нет. Брюс Экель в "Thinking in C++" приводит примеры перегрузки операторов для аналогичного случая и, похоже, предпочитает модификатор const для возвращаемого типа. Должно ли оно использоваться и почему?

С другой стороны, давайте попробуем использовать этот класс:

int main()
{
    Integer a(1), b(2);
    Integer c = a + b;
}

При создании c как суммы a и b компилятор, скорее всего, выполнит elision копирования, а Integer::operator+() создаст свой результат в месте, занимаемом c (см. " Хотите скорость? Передайте по значению") напрямую. Но когда возвращаемый тип Integer::operator+() объявлен как const, не заставит ли это компилятор выполнить копирование, поскольку цель не является const?

1 ответ

Решение

Возвращение Integer const защищает от таких вещей, как:

(a + b) = c;

Я никогда не считал, что это слишком большая проблема, но запрет на него заставляет тип вести себя как встроенные типы. Это не должно иметь никакого отношения к оптимизации возвращаемого значения.

Если класс очень дорогой для копирования и может быть сделан для эффективной поддержки rvalue ссылок, вы можете избежать constиз-за этого, но на практике я подозреваю, что такие классы достаточно редки, что вы можете позволить себе пренебречь ими.

Другие вопросы по тегам