Why can't I pass an rvalue std::stringstream by value to a function?

714 Views Asked by At

Why does this code not compile?

#include <sstream>

void f(std::stringstream) { }

int main() {
    f(std::stringstream{});
}

I get this error:

error: use of deleted function ‘std::basic_stringstream<char>::basic_stringstream(const std::basic_stringstream<char>&)’
         f(std::stringstream{});
                              ^

If I replace std::stringstream with another type that's noncopyable it works fine. Shouldn't this use stringstream's move constructor?

1

There are 1 best solutions below

0
On BEST ANSWER

The missing move constructor for stringstream is a known missing feature in GCC's implementation of the C++ standard library. If I'm reading the comments on that report correctly, it is intentionally missing because it would rely on other changes, and those other changes would break the ABI, so the GCC folks have chosen to break the ABI only once (if possible), and that time has not yet come.