今更ですが、C++11からはfstreamやstringstreamを関数の戻り値にできるようになりました。
#include <iostream> #include <fstream> std::ifstream open_config_file() { std::ifstream s("app.conf"); s.exceptions(std::ios_base::badbit | std::ios_base::failbit); // return std::move(s);でも可 return s; } int main() { auto f = open_config_file(); // ここでfから読み込む処理。 } |
例はifstreamですが、もちろんofstreamでも可能です。ムーブコンストラクタ・ムーブ代入演算子そしてswapメンバ関数が追加されています。
2015年3月22日修正:ソースコードからmove関数を外し、コメントに移動しました。
スポンサード リンク |
この記事のカテゴリ
- C++ ⇒ fstreamを返す関数
open_config_file の return にある std::move はなくてもムーブされます。(12.8[class.copy]/p.32)
std::move があると NRVO が効かなくなるので、むしろ無い方がいいかもしれません。(ムーブ効けば大したコストではないとは思いますが)
でも、libstdc++ は 4.9.2 まで stream 系根こそぎムーブコンストラクタ・ムーブ代入演算子無かったです…(4.9.3 でようやく入るみたい)
ちょっと意外でした。
ありがとうございます。私も普段はreturn文ではstd::moveを書かないスタイルを採用しており、試しに書いてみたものをそのまま記事に持ってきてしまいました。記事のほう、修正させていただきました。