2017-08-24 7 views
1

J'ai trouvé ce code dans un livre.Arguments par défaut dans un constructeur de mouvement

template<typename T,typename Container=std::deque<T> > 
class stack 
{ 
public: 
    explicit stack(const Container&); 
    explicit stack(Container&& = Container()); <<<<<< 
    //... 
} 

Je me demande quand est-ce que la valeur par défaut du constructeur de déplacement est utilisée?

Autant que je sache, dans une opération de déplacement, il y a toujours un objet source à partir duquel effectuer un mouvement.

+0

N'y a-t-il aucun constructeur par défaut? –

+5

Cela ne correspond pas à la définition d'un ['move constructor'] (http://en.cppreference.com/w/cpp/language/move_constructor). C'est juste un constructeur régulier. Un constructeur de déplacement n'est pas basé sur un modèle et se présente sous la forme de pile (stack &&). –

+0

@ FrançoisAndrieux: "... et soit il n'y a pas d'autres paramètres, soit le reste des paramètres ont tous des valeurs par défaut." – 6502

Répondre

2

Si votre classe a exactement 1 constructeur qui n'a pas de paramètres non-par défaut (y compris le constructeur par défaut), il peut être utilisé pour la construction par défaut et l'instance de cette classe. Dans l'exemple suivant, bar::bar(foo&&) est utilisé pour construire x:

struct foo {}; 

class bar 
{ 
public: 
    explicit bar(const foo&) {} 
    explicit bar(foo&& = foo()) {} 
}; 

int main() 
{ 
    bar x; 
} 

Cela n'a rien à voir avec des modèles ou déplacer la sémantique. Par exemple, vous pouvez simplement utiliser int pour un exemple beaucoup plus simple:

class foo 
{ 
public: 
    foo(int = 0) {} 
}; 

int main() 
{ 
    foo x; 
}