2017-05-05 4 views
-1

Récemment i programmé par mégarde les éléments suivants:Est-il possible d'appeler une fonction qui prend comme valeur un paramètre const?

void someFunction(const SomeClass&& value){ 
    //Some Code 
} 

Je ne voulais pas ajouter le mot-clé « const » au paramètre de valeur. Cependant, cela m'a fait penser: est-il même possible d'appeler en quelque sorte cette fonction, si une fonction équivalente sans const existe? Si oui, cela a-t-il un sens et y a-t-il un usage pratique?

+0

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

Répondre

2

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. [...]

+0

Voir le commentaire sur l'article lié pour plus d'informations sur pourquoi avec 'int' il utilise la surcharge non-'const': *" Il n'y a pas de prvalues ​​const des types scalaires Pour une valeur constante, vous avez besoin d'une valeur X et/ou Je suis presque sûr qu'un compilateur conforme traiterait f (g()) comme f (1) en termes de résolution de surcharge puisque g ne renvoie qu'une valeur et non un objet. "* – clcto

+0

@clcto Merci pour la clarification – user463035818