8
votes

Si une fonction renvoie une INT, une INT peut-elle être assignée?

Si une fonction renvoie un int, peut-il être attribué par une valeur int? Je ne vois pas que cela fait trop de sens pour affecter une valeur à une fonction.

int& f() {}

f() = 1;


1 commentaires

Quel serait le point d'affecter une valeur à une fonction? Pourquoi ne pas utiliser une variable à la place?


4 Réponses :


1
votes

Ce n'est pas limité à INT uniquement, mais pour les types primitifs, il n'ya pas de point de le faire. C'est utile lorsque vous avez vos classes


3 commentaires

Voulez-vous dire qu'il n'y a pas de point dans le retour d'une référence à un type primitif? Alors, des choses comme opérateur [] de vecteur sont inutiles?


Il y a beaucoup de points de faire (si par "cela", vous voulez dire retourner une référence) - si vous avez un std :: vecteur alors les fonctions qui accèdent les choses dans les références de retour de vecteur int.


Dans le contexte de son exemple



22
votes

La première fonction renvoie une valeur entière de valeur, qui est une valeur R (forte> R-R-Value forte>. Vous ne pouvez pas attribuer à une valeur R en général. La seconde f () renvoie une référence à un entier, qui est une valeur L - de sorte que vous pouvez l'affecter.

int& f() { int a = 4; return a; }


3 commentaires

Pourriez-vous expliquer pourquoi la valeur de retour est une valeur R?


La valeur de retour d'une fonction n'est pas une variable C ++ appropriée, telle que int i; . C'est juste une valeur temporaire. Il ne représente pas un emplacement de mémoire.


@skydoor, il peut être résumé par "Vous ne pouvez attribuer qu'aux objets" . Dans votre appel, la fonction renvoie une valeur qui ne correspond pas à un objet: l'entier représente juste une valeur abstraite. Si vous aviez, par exemple, renvoyé un std :: string , la valeur renvoyée (qui est en fait une valeur R) correspondre à un objet de chaîne, et vous pourrait Attribuez-le. Il en va de même pour une valeur de retour int & . Dans ce cas, la "valeur" renvoyée (qui est une valeur L) correspond à un objet int objet et que vous pouvez l'affecter. Un objet est nécessaire, car une affectation modifie un état stocké.



2
votes

0
votes

Si une fonction renvoie un objet par valeur, l'affectation est possible, même si l'appel de la fonction est une r devalue. Par exemple:

some_function(++list.begin());


3 commentaires

C'est un cas commun? Peux-tu me donner un exemple?


Bien que je comprends que c'est juste un exemple, remarquez que ++ list.begin () n'est pas tenu de fonctionner. L'opérateur peut être implémenté comme une fonction libre qui accepte une référence non-Const et ne parviendra pas à se lier à l'itérateur temporaire.


Merci, je ne me souviens jamais de quels opérateurs ont aux fonctions membres et qui peuvent être des fonctions libres.