Если функция возвращает интервал, она может быть присвоена международным значением? Я не вижу, что имеет слишком много смысла присваивать значение функции.
int f() {}
f() = 1;
Я заметил, что, если функция возвращает ссылку на интервал, она в порядке. Это ограничивается только интервалом? как насчет других типов? или какие-либо другие правила?
int& f() {}
f() = 1;
Первая функция возвращает целое число по значению, которое является 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; }
Вы возвращаете ссылку на временный объект, который больше не действителен после возврата из функции. Доступ к ссылке вызывает неопределенное поведение.
Это не ограничивается только int, но для примитивных типов в этом нет смысла. Это полезно, когда у вас есть классы
Если функция возвращает объект по значению, то присвоение возможно, даже если вызов функции является r-значением. Например:
std::string("hello") = "world";
Это создает временный строковый объект, изменяет его, а затем немедленно уничтожает. Более практичный пример:
some_function(++list.begin());
Вы не могли написать list.begin () + 1
, потому что добавление невозможно для итераторов списка, но с увеличением можно. В этом примере не используется присваивание, но присваивание - это просто частный случай более общего правила «функции-члены могут вызываться для rvalue».