Перегрузка оператора, которая позволяет захватывать с помощью rvalue, но не присваивать - PullRequest
7 голосов
/ 05 мая 2011

Можно ли спроектировать и как сделать перегруженным operator+ для моего класса C, чтобы это было возможно:

C&& c = c1 + c2;

но это невозможно:

c1 + c2 = something;

Edit: Я изменил объекты на маленькие буквы. c1, c2 и c являются объектами класса C. && - это не логический operator&&, а скорее ссылка на значение.

Например, писать:

double&& d = 1.0 + 2.0;

- это 100% правильный (новый) код C ++, тогда как

1.0 + 2.0 = 4.0;

, очевидно, ошибка компилятора. Я хочу точно то же самое, но вместо двойного, для моего класса C.

Второе редактирование: Если мой оператор возвращает C или C &, у меня может быть присваивание rvalue-ссылки, но также присваивание c1 + c2, что бессмысленно. Задание const здесь отключает его, но также отключает присваивание rvalue. По крайней мере на VC ++ 2k10. Так как же это сделать в два раза?

1 Ответ

10 голосов
/ 05 мая 2011

Пусть оператор присваивания может вызываться только для l-значений:

class C
{
    // ...

public:

    C& operator=(const C&) & = default;
};

Запишите один амперсанд после закрывающей скобки.Это предотвращает присвоение значений.

...