Нет, возвращаемое значение функции является l-значением тогда и только тогда, когда оно является ссылкой (C ++ 03).(5.2.2 [expr.call] / 10)
Если возвращаемый тип является базовым типом, то это будет ошибкой компиляции.(5.17 [expr.ass] / 1)
Причина, по которой это работает, заключается в том, что вам разрешено вызывать функции-члены (даже не const
функции-члены) для r-значений типа класса и назначенияиз foo
является функцией-членом, определенной реализацией: foo& foo::operator=(const foo&)
.Ограничения для операторов в разделе 5 применяются только к встроенным операторам , (5 [expr] / 3), если разрешение перегрузки выбирает перегруженный вызов функции для оператора, тогда вместо этого применяются ограничения для этого вызова функции.
Именно поэтому иногда рекомендуется возвращать объекты типа класса в виде const
объектов (например, const foo q();
), однако это может оказать негативное влияние на C ++ 0x, где он может запретить семантику перемещения.работать как надо.