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へ修正


スポンサード リンク

この記事のカテゴリ

  • ⇒ ストリームの一時オブジェクト