C++11では、iostream関係のオブジェクトを一時オブジェクトとして作成するコードが容易に記述できるようになりました。
#include <fstream> #include <string> int main() { std::string s = "hello world"; std::ofstream("hoge.txt") << s << std::endl; } |
C++03だと上のコードはエラーになります。厄介なことに、型によっては中途半端にコンパイルできるのでタチが悪いです。
#include <fstream> int main() { std::ofstream("hoge.txt") << "hello world" << std::endl; } |
C++03でこれを実行すると、謎の十六進法の値が出力されると思います。void*を出力する<<演算子が見つかるからです。もちろん、C++11なら、ばっちしhello worldが出力されるので安心してください。
この例ではofstreamを例に取りましたが、basic_ostream/basic_istreamに対する変更なので、ifstream/fstreamやstringstream類でも同じです。
なお、Visual C++では/we4239コンパイラオプションを付けましょう。そうしないと、2008およびそれ以前では上記C++03の挙動になりません。C++規格準拠の挙動に近づける設定なので、C++11対応し始めている2010およびそれ以降でも使用して損はありません。
2012年5月8日:basic_ofstream/basic_ifstreamをbasic_ostream/basic_istreamへ修正
スポンサード リンク |
この記事のカテゴリ
- C++ ⇒ ストリームの一時オブジェクト