Ce code:
#include <iostream>
using namespace std;
struct s{};
void someFunction(s& value){ std::cout << "ref" << std::endl; }
void someFunction(const s&& value){ std::cout << "const" << std::endl; }
void someFunction(s&& value){ std::cout << "non const" << std::endl; }
const s foo() { return s(); }
s bar() { return s(); }
int main() {
someFunction(bar());
someFunction(foo());
return 0;
}
Prints
non const
const
Pour une explication (que je ne peux pas fournir;) Je vous renvoie à this site. La citation la plus pertinente est:
[...] Cela rend les références const rvalues plutôt inutiles. Pensez-y: si tout ce dont nous avons besoin est une référence non modifiable à un objet (rvalue ou lvalue), alors une référence const lvalue fait parfaitement l'affaire. La seule situation dans laquelle nous voulons isoler les valeurs est si nous voulons les déplacer de . Et dans ce cas, nous avons besoin d'une référence modifiable.
Le seul cas d'utilisation que je pouvais imaginer est d'utiliser someFunction
pour détecter si une seconde fonction retourne un const
ou un const
non, mais je suppose qu'il existe des moyens plus faciles à trouver cela.
En sidenote: Lorsque vous remplacez s
avec int
dans le code ci-dessus it prints:
non const
non const
et c'est parce que (citant le même site, commentaire de Pizer):
Il y a pas de prvalues const des types scalaires. Pour une valeur constante, nécessite une valeur X et/ou un objet de type classe. [...]
http://www.codesynthesis.com/~boris/blog/2012/07/24/const-rvalue-references/. "Plus précisément, une valeur de consigne préférera se lier à la référence de const rvalue plutôt qu'à la référence const lvalue." Mais, vous ne devriez pas vous embêter avec des valeurs constantes. Ils n'ont pas beaucoup de sens. – mutex36