Макрос встроенного макроса ostringstream

Ссылаясь на макрос в формате С++/встроенный ostringstream

Вопрос о макросе, который позволяет встроить конкатенацию объектов для создания строки, iostream-style.

Ответ был:

#define SSTR( x ) dynamic_cast< std::ostringstream & >( \
        ( std::ostringstream().seekp( 0, std::ios_base::cur ) << x ) \
    ).str()

Использование (например):

throw std::runtime_error(
        SSTR( "FooBar error: Value " << x << " exceeds " << y )
);

Это прекрасно работает - с GCC. Он компилируется и запускается в Visual С++ 2005. Но с последним все применения макроса приводят к пустым строкам, и я совершенно ошарашен, почему и как его исправить...?

Ответ 1

К сожалению, у меня нет доступа к компилятору MSVC для тестирования.

В моих прошлых опытах с инструментами microsoft, похоже, что microsoft рассматривает определения и стандарты языка как нечто большее, чем приблизительное руководство. (Я потерял много времени на проектах только для того, чтобы обнаружить, что Microsoft нарушила традицию с чем-то основным, как C99.)

Учитывая эту печальную ситуацию, я предлагаю вам экспериментировать с рядом тривиальных программ. Такие вещи, как:

std::ostringstream() o;
o.seekp( 0, std::ios_base::cur ) << "foo";
cout << "Test1:  " << o << endl;

Или, возможно:

std::ostringstream() o;
cout << "Test2:  " << typeid(o).name() << endl;
cout << "Test3:  " << typeid(o.seekp( 0, std::ios_base::cur )).name() << endl;

Попытайтесь увидеть, в какой момент все перестает работать. Затем откройте проблему.