2010-12-15 93 views
1

Je suis nouveau pour déplacer constructeur et assez confus avec le comportement VS2010. Je dessine un constructeur de déplacement (classe A) qui ma connaissance est comme ceci:Déplacer constructeur, constructeur de copie non-const, emplace de la liste dans VS2010

A(A&& input) {some code} 

Lorsque j'utilise la emplace de liste et mettre une instance de la classe A:

mylist.emplace(a); 

Mon constructeur de déplacement est pas appelé, et un constructeur de copie non-const est appelée à la place:

A(A& input) {the same code as move constructor} 

d'autre part quand je fais ceci:

mylist.emplace(A(2)); 

Mon constructeur de déplacement est appelé comme il le devait. Donc, ma question est:

  1. Pourquoi est-ce que l'emplace de liste appelle mon constructeur de copie non-const au lieu de mon constructeur de déplacement?
  2. Est-ce que le constructeur de copie non const est en fait une autre façon de définir un constructeur de déplacement?
  3. Ce comportement est-il correct (pour un compilateur C++ 0x) ou simplement le comportement de VS2010?

Merci d'avance à un groupe.

+0

Si votre constructeur de copie a le même comportement que votre constructeur de mouvement, la classe n'est-elle pas sérieusement endommagée? – UncleBens

+0

@UncleBens: Pas nécessairement, les deux peuvent faire une copie. – ybungalobill

+0

@ybungalobill: Dans un tel cas, pourquoi définir (plutôt que peut-être désactiver) le constructeur de déplacement? Et si le constructeur de copie fait une copie, pourquoi devrait-il prendre une référence non-const? – UncleBens

Répondre

2
mylist.emplace(a); 

Voici a est une valeur L, d'où il est copié plutôt que déplacé. Vous devez move il explicite:

mylist.emplace(std::move(a)); 

Oui, le comportement est correct.