Если функция возвращает значение int, можно ли присвоить ей значение int?
Вопрос
Если функция возвращает значение int, может ли оно быть присвоено значением int?Я не вижу особого смысла присваивать значение функции.
int f() {}
f() = 1;
Я заметил, что, если функция возвращает ссылку на int, все в порядке.Ограничено ли это только int?как насчет других типов?или какие-то другие правила?
int& f() {}
f() = 1;
Решение
Первая функция возвращает целое число по значению, которое R-Value. Анкет Вы не можете назначить R-значение в целом. Второй f () возвращает ссылку на целое число, которое является значением L, - так что вы можете назначить ему.
int a = 4, b = 5;
int& f() {return a;}
...
f() = 6;
// a is 6 now
ПРИМЕЧАНИЕ. Вы не присваиваете значение функции, вы просто присваиваете его возвращаемому значению. Будьте осторожны со следующим:
int& f() { int a = 4; return a; }
Вы возвращаете ссылку на временный, который больше не действителен после возврата функции. Доступ к ссылке вызывает неопределенное поведение.
Другие советы
- Что такое Lvalues и Rvalues? автор : Дэнни Калев
- Значения Lvalues и Rvalues автор : Дэн Сакс
- Значения Lvalues и Rvalues автор : Микаэль Килпеляйнен
Это не ограничение только для Int, но для примитивных типов нет смысла делать это. Это полезно, когда у вас есть занятия
Если функция возвращает объект по значению, тогда возможна назначение, даже если вызов функции является RValue. Например:
std::string("hello") = "world";
Это создает временный струнный объект, мутирует его, а затем немедленно разрушает его. Более практичным примером является:
some_function(++list.begin());
Вы не могли бы написать list.begin() + 1
, поскольку дополнение невозможно в итераторах списка, но приращение в порядке. Этот пример не включает назначение, но назначение является лишь особым случаем более общего правила «функции члена члена могут быть вызваны на RVALUES».