Должно ли возвращаемое значение бинарного оператора + перегрузка быть постоянным и может ли это помешать оптимизации?
Учитывая пример кода:
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
из-за этого, но на практике я подозреваю, что такие классы достаточно редки, что вы можете позволить себе пренебречь ими.