簡體   English   中英

臨時ostream對象的c ++問題

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM