Манипуляторы каким-то образом конвертируют тип потока?

Я пытаюсь использовать аноним ostringstream генерировать string: Используйте анонимный поток строк для создания строки

Однако, когда я использую манипуляторы, я не могу больше компилировать:

const auto myString(static_cast<ostringstream>(ostringstream{} << setfill('!') << setw(13) << "lorem ipsum").str());

Но это, кажется, недопустимо даже в gcc 5.1:

prog.cpp: в функции int main():
prog.cpp: 8: 109: ошибка: нет соответствующей функции для вызова std::basic_ostringstream<char>::basic_ostringstream(std::basic_ostream<char>&)
const auto myString(static_cast<ostringstream>(ostringstream{} << setfill('!') << setw(13) << "lorem ipsum").str());


В файле из / usr / include / C++/5/iomanip:45:0,
из prog.cpp: 1:
/ usr / include / C++/5/sstream:582:7: примечание: кандидат
std::basic_ostringstream<_CharT, _Traits, _Alloc>::basic_ostringstream(std::basic_ostringstream<_CharT, _Traits, _Alloc>&&)_CharT = char; _Traits = std::char_traits<char>; _Alloc = std::allocator<char>]
basic_ostringstream(basic_ostringstream&& __rhs)

/ usr / include / C++/5/sstream:582:7: примечание: нет известного преобразования для аргумента 1 из std::basic_ostream<char> в std::basic_ostringstream<char>&&
/ usr / include / C++/5/sstream:565:7: примечание: кандидат:
std::basic_ostringstream<_CharT, _Traits, _Alloc>::basic_ostringstream(const __string_type&, std::ios_base::openmode)_CharT = char; _Traits = std::char_traits<char>; _Alloc = std::allocator<char>; std::basic_ostringstream<_CharT, _Traits, _Alloc>::__string_type = std::basic_string<char>; std::ios_base::openmode = std::_Ios_Openmode]
basic_ostringstream(const __string_type& __str,

/ usr / include / C++/5/sstream:565:7: примечание: нет известного преобразования для аргумента 1 из std::basic_ostream<char> в const __string_type& {aka const std::basic_string<char>&}
/ usr / include / C++/5/sstream:547:7: примечание: кандидат:
std::basic_ostringstream<_CharT, _Traits, _Alloc>::basic_ostringstream(std::ios_base::openmode)_CharT = char; _Traits = std::char_traits<char>; _Alloc = std::allocator<char>; std::ios_base::openmode = std::_Ios_Openmode]
basic_ostringstream(ios_base::openmode __mode = ios_base::out)

/ usr / include / C++/5/sstream:547:7: примечание: нет известного преобразования для аргумента 1 из std::basic_ostream<char> в std::ios_base::openmode {aka std::_Ios_Openmode}

Это еще одна ошибка потока gcc или то, что я делаю, на самом деле незаконно?

1 ответ

Решение
static_cast<ostringstream>(...)

Это будет пытаться построить новый ostringstream из аргумента в паренсе, std::ostream&, для которого нет конструктора std::ostringstream,

Вы просто хотите привести ссылку обратно к исходному типу. Сделайте приведение к ссылке:

static_cast<ostringstream&>(...)

Тогда все работает нормально.

Я не знаю, что, по вашему мнению, сработало, но если оставить ссылку и убрать манипуляторы, это все равно не поможет.

Другие вопросы по тегам