2011/4/11 Maxime van Noppen <maxime@altribe.org>
Hi,

I've got a question about the reuse of the boost::format object. Given
this minimal testcase:

-----------------------------------------------------------
#include <iostream>
#include <boost/format.hpp>

int main()
{
 boost::format fmt("%|=12| %|=12| %|=12|\n");

 // 1
 std::cout
   << boost::str(fmt % "a" % "b" % "c")
   << boost::str(fmt % 1 % 2 % 3);

 // 2
 std::cout
   << fmt % "a" % "b" % "c"
   << fmt % 1 % 2 % 3;
}
-----------------------------------------------------------


Why is 1 working while 2 produces the runtime exception:

> terminate called after throwing an instance of 'boost::exception_detail::clone_impl<boost::exception_detail::error_info_injector<boost::io::too_many_args> >'
>   what():  boost::too_many_args: format-string referred to less arguments than were passed

?

I believe a possible reason is that order of evaluation of the operations is unspecified.

A simple example of this mechanism would be:
int i = 0;
cout << i++ << ++i; // what will this print? It's unspecified and compiler dependant

To make your example work, try:
cout << fmt % "a" % "b" % "c";
cout << fmt % 1 % 2 % 3;

Regards
Kris