Se una delle funzioni restituiscono un valore di tipo int, può essere un int assegnato?
Domanda
Se una funzione restituisce un int, può essere assegnato un valore di tipo int?Non vedo che rende molto senso per assegnare un valore ad una funzione.
int f() {}
f() = 1;
Ho notato che, se la funzione restituisce un riferimento ad un int, è ok.È limitato solo a int?come su altri tipi?o qualsiasi altra regola?
int& f() {}
f() = 1;
Soluzione
La prima funzione restituisce un numero intero per valore, che è un valore r . Non è possibile assegnare ad un valore di R in generale. Il secondo f () restituisce un riferimento a un numero intero, che è un l-value -. Modo da poter assegnare ad esso
int a = 4, b = 5;
int& f() {return a;}
...
f() = 6;
// a is 6 now
Nota: non si assegna un valore alla funzione, basta assegnare al suo valore di ritorno. Fate attenzione con il seguente:
int& f() { int a = 4; return a; }
Si sta tornando un riferimento a una temporanea, che non è più valido dopo la funzione ritorna. Accesso al riferimento invoca un comportamento indefinito.
Altri suggerimenti
- Quali sono Lvalues e Rvalues? da Danny Kalev
- Lvalues e Rvalues da Dan Saks
- Lvalues e Rvalues da Mikael Kilpeläinen
Non è limita a int solo, ma per i tipi primitivi lì non ha senso farlo. E 'utile quando si hanno le classi
Se una funzione restituisce un oggetto per valore, quindi l'assegnazione è possibile, anche se la chiamata di funzione è un rvalue. Ad esempio:
std::string("hello") = "world";
Questo crea un oggetto stringa temporanea, muta, e poi subito la distrugge. Un esempio più pratico è:
some_function(++list.begin());
Non si poteva scrivere list.begin() + 1
, perché oltre non è possibile in iteratori lista, ma incremento va bene. Questo esempio non comporta l'assegnazione, ma l'assegnazione è solo un caso particolare della regola più generale "funzioni membro possono essere chiamati rvalues".