Почему boost::format не может быть преобразован непосредственно в std:: string? [закрытый]

не возможно:

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

вы должны явно вызвать метод STR():

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

это только синтаксический сахар, но почему бы просто не добавить преобразование?

2 ответов


это не очень хорошо, если неявное преобразование может вызывать исключения. Преобразование в string по умолчанию вызовет исключение, если в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() вызовы предоставляют намек на такие возможные исключения, что упрощает жизнь при обеспечении безопасности исключений окружающего кода, а также (в этот конкретный случай), намекая на двойную проверку предыдущего кода, чтобы предотвратить указанное исключение в первую очередь.


Я думаю, что причина этого такая же, как std::stringstream в этом контексте следует также использовать .str() чтобы преобразовать поток в строку и то же самое для boost::formatter а причина такова:

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