2017-08-24 58 views
1

我在書中發現了這段代碼。移動構造函數中的默認參數

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

我想知道什麼時候使用移動構造函數的默認值?

盡我所知,在移動操作中始終存在一個源對象。

+0

是不是有任何默認構造函數? –

+5

這不符合['move構造函數'](http://en.cppreference.com/w/cpp/language/move_constructor)的定義。這只是一個常規的構造函數。移動構造函數不是模板化的,而是以「stack(stack &&)」的形式出現。 –

+0

@FrançoisAndrieux:「...要麼沒有其他參數,要麼其餘參數都有默認值。」 – 6502

回答

2

如果你的類有一個沒有非默認值參數的構造函數(包括默認構造函數),它可以用來默認構造該類的實例。在下面的例子中,bar::bar(foo&&)用於構建X:

struct foo {}; 

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

int main() 
{ 
    bar x; 
} 

這有什麼好做的模板或移動語義。例如,您可以使用int作爲一個更簡單的示例:

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

int main() 
{ 
    foo x; 
}