Как можно присвоить возвращаемый объект?

StackOverflow https://stackoverflow.com/questions/8832304

  •  27-10-2019
  •  | 
  •  

Вопрос

В разделе 3 «Эффективный C ++» Скотт Мейерс предлагает перегрузить operator* для класса с именем Rational:

родовое слово

Причина, по которой возвращаемое значение квалифицируется как const, объясняется в следующей строке: если бы это было не const, программисты могли бы написать такой код, как:

родовое слово

или, что более вероятно:

родовое слово

Достаточно честно. Теперь я запутался, так как думал, что возвращаемое значение функции, здесь operator *, было rvalue, поэтому не могло быть присвоено.Я считаю, что это не может быть назначено, потому что если бы у меня было:

родовое слово

, который не удалось скомпилировать с помощью invalid lvalue in assignment. Почему здесь этого не происходит?Может кто-нибудь пролить свет на это?

РЕДАКТИРОВАТЬ : я видел много других тем, посвященных этому же пункту Скотта Мейерса, но ни одна из них не решала проблему rvalue, которую я описал здесь.

Это было полезно?

Решение

Дело в том, что для типов классов a = b - это просто сокращение от a.operator=(b), где operator= - функция-член.А функции-члены могут вызываться для rvalue.

Обратите внимание, что в C ++ 11 вы можете запретить это, сделав operator= lvalue-only:

родовое слово

Код & сообщает компилятору, что эту функцию нельзя вызывать для значений r.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top