2012-03-21 3 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

+1

Дани, это неправда, существует множество неконвертируемых типов, которые можно перемещать, если это не просто оптимизация, например. 'std :: unique_lock',' std :: unique_ptr' («old unique_ptr», на который вы ссылаетесь, является 'std :: auto_ptr', который запутывает, но предшествует семантике перемещения), и, как и в вопросе,' std :: ostringstream'. Iostreams будет перемещаться в выпуске GCC 5.0. –

ответ

3

iostreams являются подвижными, но только если у вас есть поддержка C++ 11. Gcc 4.4, вероятно, недостаточно для этого.

Конструктор копирования частного базового класса предназначен для того, чтобы сделать классы не скопируемыми (но возможно подвижными).