[英]c++ problems with temporary ostream objects
我想改變這個工作代碼:
ofstream outfile("my_file.txt");
copy(v.begin(), v.end(), ostream_iterator<int>(outfile));
進入這個:
copy(v.begin(), v.end(), ostream_iterator<int>(ofstream("my_file.txt")));
換句話說,我使用ofstream對象的“匿名”或未命名版本。
兩個問題:
(1)為什么第二次嘗試失敗?
(2)第二次嘗試在風格上是否很好,或者在C ++中保持所有明確命名的更好? 我來自Python背景,其中對象是一直在創建的。
謝謝!!
ostream_iterator<T>
構造const
對流對象采用非const
引用 ,而temporaries最多可以作為const
引用傳遞(至少在C ++ 03中); 在這個問題中很好地解釋了這個的基本原理。
順便說一句,這里沒有太多關於如何傳遞流的選擇:一個const
引用沒有意義( ostream_iterator
必須修改流),而普通的ostream
是不可接受的,因為它是非可復制(切片會殺死多態)。
在Python中,你可以逃脫構建/在飛行中通過的東西,因為你總是引用處理引用計數 (和垃圾收集的) 對象 。
C ++對象語義完全不同 - 對象是對象,而不是引用; 要獲得類似於Python的語義,您必須使用new
動態分配每個對象,並將它們傳遞給shared_ptr<T>
。
在C ++中保持所有顯式命名是否更好
不一定 - 創造臨時工作是完全正常的,但你必須知道你能做什么,不能做什么,參考如何影響他們的生命,等等。
我從我的編譯器收到以下錯誤消息,解釋它。
std::ostream_iterator
的構造函數采用非const引用。 沒有一個版本的構造函數采用std :: ofstream。
Untitled 33.cpp:21: error: no matching function for call to ‘std::ostream_iterator<int, char, std::char_traits<char> >::ostream_iterator(std::ofstream)’
/usr/include/c++/4.2.1/bits/stream_iterator.h:185: note: candidates are: std::ostream_iterator<_Tp, _CharT, _Traits>::ostream_iterator(const std::ostream_iterator<_Tp, _CharT, _Traits>&) [with _Tp = int, _CharT = char, _Traits = std::char_traits<char>]
/usr/include/c++/4.2.1/bits/stream_iterator.h:181: note: std::ostream_iterator<_Tp, _CharT, _Traits>::ostream_iterator(std::basic_ostream<_CharT, _Traits>&, const _CharT*) [with _Tp = int, _CharT = char, _Traits = std::char_traits<char>]
/usr/include/c++/4.2.1/bits/stream_iterator.h:169: note: std::ostream_iterator<_Tp, _CharT, _Traits>::ostream_iterator(std::basic_ostream<_CharT, _Traits>&) [with _Tp = int, _CharT = char, _Traits = std::char_traits<char>]
在C ++中,我們還經常構建對象,但需要注意所有權問題。
ostream_iterator<int>(ofstream("my_file.txt"))
是臨時對象傳遞給構造函數,但構造的ostream_iterator
對象不承擔臨時ostream_iterator
所有權。 如果ostream_iterator
也不是臨時的,它將繼續在下一行代碼中保持無效引用。
通過傳遞身份功能或通過強制轉換,可以解決這個問題。 但是他們通常犧牲安全性,因為如果你在持久變量上使用這樣的機制,它將創建一個懸空引用。
當你有幾個通過引用鏈接的對象,沒有容器包含的關系時,當前的C ++最佳實踐是使用命名對象,而不是臨時對象。
如果您不喜歡這樣,您可以選擇更頻繁地使用共享指針。 該模式允許在多個引用之間共享所有權,並隱藏容器。 但這不是iostream的一部分,作為設計決定,這里有點可疑。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.