12

次のことはできません。

std::string s = boost::format("%d") % 1; // error

メソッド str() を明示的に呼び出す必要があります。

std::string s = (boost::format("%d") % 1).str(); // OK

それは単なるシンタックス シュガーですが、なぜ変換を追加しないのでしょうか?

4

2 に答える 2

11

この理由は と同じだと思います。std::stringstreamそのコンテキストでは.str()、ストリームを文字列に変換するためにも使用する必要がboost::formatterあり、理由は次のとおりです。

std::string s1 = "Hello ", s2 = "World";
format("%s.") % s1 + s2;

boost::formatterが暗黙的に変換可能である場合std::string、「Hello .World」が生成format("%s.") % s1されます。これは、「Hello 」に変換されるためです。その後、暗黙的に に変換され、で追加するためにstd::string使用されますが、おそらくほとんどのプログラマーは「Hello World」を望んでいます。そして、それはエラーや混乱の原因になります。ただし、暗黙的な変換が存在しない場合、コンパイラはこれに対してエラーを生成し( for andがないため)、またはとして修正する必要がありますoperator+s2operator+boost::formatterstd::stringformat("%s.") % (s1 + s2)str( format("%s.") % s1 ) + s2

于 2012-10-18T10:06:29.300 に答える
9

暗黙の変換によって例外がスローされる可能性がある場合、それはあまり良いことではありません。文字列への変換は、引数がformat必要以上に少ない場合、デフォルトで例外をスローします。例えば

std::string f()
{
   boost::format fmt("%d");
   // forgot to feed an argument
   std::string s = fmt;  // throws boost::io::too_few_args
   widget.set_title( fmt );  // throws boost::io::too_few_args
   return fmt;  // throws boost::io::too_few_args
}

このような暗黙的な変換により、例外をスローする可能性のあるコードの部分を見つけて分析することが難しくなります。しかし、明示的な.str()呼び出しは、そのような可能性のある例外のヒントを提供します。これにより、周囲のコードの例外の安全性を確保するときの作業が楽になります。また、(この特定のケースでは) 前述のコードを再確認して、最初に例外が発生するのを防ぐようにヒントを与えることもできます。

于 2012-10-18T10:15:31.473 に答える