Если функции возвращают int, можно ли присвоить ему int? - PullRequest
8 голосов
/ 07 февраля 2010

Если функция возвращает значение типа int, может ли оно быть присвоено значением типа int? Я не вижу смысла присваивать значение функции.

int f() {}

f() = 1;

Я заметил, что если функция возвращает ссылку на int, это нормально. Это ограничено только int? как насчет других типов? или какие-то другие правила?

int& f() {}

f() = 1;

Ответы [ 4 ]

22 голосов
/ 07 февраля 2010

Первая функция возвращает целочисленное побочное значение, которое является r-значением . Вы не можете присвоить значение 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; }

Вы возвращаете ссылку на временный объект, который больше не действителен после возврата из функции. Доступ к ссылке вызывает неопределенное поведение.

2 голосов
/ 07 февраля 2010
1 голос
/ 07 февраля 2010

Это не предел только для int, но для примитивных типов нет смысла делать это. Это полезно, когда у вас есть классы

0 голосов
/ 07 февраля 2010

Если функция возвращает объект по значению, тогда присваивание возможно, даже если вызов функции является rvalue. Например:

std::string("hello") = "world";

Это создает временный строковый объект, изменяет его, а затем немедленно уничтожает. Более практичный пример:

some_function(++list.begin());

Вы не можете написать list.begin() + 1, потому что на итераторах списка добавление невозможно, но приращение в порядке. Этот пример не включает присваивание, но присваивание является лишь частным случаем более общего правила «функции-члены могут вызываться по rvalues».

...