2012-03-21 85 views
1

我試圖爲聚合ostringstream的類創建一個移動構造函數。不過,我一直運行到g ++ 4.4:iostream移動語義

/usr/include/c++/4.4.5/bits/ios_base.h:790: error: 
    ‘std::ios_base::ios_base(const std::ios_base&)’ is private 

這是我能想出

struct C { 
    C(){ s << "start! "; } 
    C(C&& c): s(std::move(c.s)){ s << " moved "; } 
    std::ostringstream s; 
private: 
    C(const C&); 
}; 

C f() { return C(); } 

int main(){ 
    C c=f(); 
    c.s << "aha"; 
    std::cout << c.s.str() << std::endl; 
} 

最簡單的代碼是Iostreams庫旨在實現移動語義?還是僅僅是g ++ 4.4.5還不支持它們呢?

+1

移動語義只能作爲複製的優化。如果不可複製的類可以移動,就會像舊的unique_ptr一樣造成混淆。如果您需要使用智能指針,請使用智能指針 – Dani 2012-03-21 10:30:01

+1

Dani,事實並非如此,有很多不可複製的類型可移動,而不僅僅是優化,例如, 'std :: unique_lock','std :: unique_ptr'(你引用的「old unique_ptr」是'std :: auto_ptr',這很令人困惑,但它早於語義),並且在問題中,'std :: ostringstream'。 Iostreams將在GCC 5.0版本中移動。 – 2014-09-22 13:22:06

回答

3

iostreams是可移動的,但前提是您擁有C++ 11支持。海灣合作委員會4.4可能是不夠的。

專用基類複製構造函數正是爲了使類不可複製(但可能是可移動的)。