2017-06-01 6 views
1

J'ai fait un test simple pour mieux comprendre la sémantique du mouvement. Le résultat de sortie était inattendu pour moi. Bellow est ma fonction de test:Déplacer la sémantique pour lvalue

template<class T> 
void test(T&& v) 
{ 
    v++; 
} 

void main() 
{ 
    int v = 1; 
    test(std::move(v)); 
    std::cout << "Output:" << v << std::endl; 
} 

Je me attendais: Sortie: 1 Mais résultat réel était: Sortie: 2

Je pensais comme suit: - J'utilise std :: move (v), comme résultat, j'ai la conversion en "rvalue" et la fonction de test fonctionnera avec la variable temporelle. Par conséquent, le résultat devrait être Output: 1. Qu'est-ce qui ne va pas dans mes conclusions?

+1

void principal n'est pas conforme à la norme C++. –

+0

Le nom de 'std :: move' est mal choisi, et c'est probablement ce qui vous a rendu confus. Ça ne bouge pas vraiment. Il jette juste une valeur à une valeur, ce qui rend * possible * de faire un mouvement. –

Répondre

0

std::move ne construit jamais un temporaire. C'est une conversion à une référence rvalue.

Cette référence est liée à main::v, puis le paramètre test::v est initialisé avec elle, et donc également lié à main::v.

Si vous voulez créer un temporaire, utilisez un casting:

test(int{v}); 
0

Pour vous aider à comprendre quel type de votre modèle déduit, vous pouvez utiliser la macro __PRETTY_FUNCTION__

template<class T> 
void test(T&& v) 
{ 
    std::cout<< __PRETTY_FUNCTION__ << std::endl; 
    v++; 
} 

aussi ce gars explique beaucoup de choses sur la déduction de gabarit (votre cas à 35 ')

https://www.youtube.com/watch?v=vwrXHznaYLA