Я пытался создать конструктор перемещения для класса, который объединяет 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, который их еще не поддерживает?
Перенос семантики должен только быть оптимизацией для копирования. Если не скопированные классы могут быть перемещены, это создаст путаницу, как старый unique_ptr. Используйте интеллектуальные указатели, если вам нужно играть с потоками. – Dani
Дани, это неправда, существует множество неконвертируемых типов, которые можно перемещать, если это не просто оптимизация, например. 'std :: unique_lock',' std :: unique_ptr' («old unique_ptr», на который вы ссылаетесь, является 'std :: auto_ptr', который запутывает, но предшествует семантике перемещения), и, как и в вопросе,' std :: ostringstream'. Iostreams будет перемещаться в выпуске GCC 5.0. –