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

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

int f() {}

f() = 1;

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

int& f() {}

f() = 1;
8
задан gsamaras 29 July 2016 в 18:35
поделиться

4 ответа

Первая функция возвращает целое число по значению, которое является 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; }

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

22
ответ дан 5 December 2019 в 06:37
поделиться
2
ответ дан 5 December 2019 в 06:37
поделиться

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

1
ответ дан 5 December 2019 в 06:37
поделиться

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

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

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

some_function(++list.begin());

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

0
ответ дан 5 December 2019 в 06:37
поделиться
Другие вопросы по тегам:

Похожие вопросы: