c ++使用单行m.swap清除字符串流(std :: stringstream());?

5 c++ stringstream visual-studio-2013

我一直在使用以下代码来清除std::stringstream:

m.swap(std::stringstream());
Run Code Online (Sandbox Code Playgroud)

代码可能来自这个SO线程.最近我在Visual Studio 2013中编译了我的代码,我收到了以下警告:

warning C4239: nonstandard extension used : 'argument' : conversion from 'std::basic_stringstream<char,std::char_traits<char>,std::allocator<char>>' to 'std::basic_stringstream<char,std::char_traits<char>,std::allocator<char>> &'
1>          A non-const reference may only be bound to an lvalue
Run Code Online (Sandbox Code Playgroud)

我没有在早期版本的Visual Studio中使用/ W4收到任何警告.我记得在早期版本中我无法可靠地清除字符串流,这就是我最初使用该代码的原因.

因此,通过这种方式清除字符串流是否可移植,如果没有,你可以解释为什么不呢?还有一种可移植的方式来清除字符串流吗?谢谢

编辑:这是请求的代码.使用它来编译它/W4以查看警告.

int _tmain(int argc, _TCHAR* argv[])
{
    std::stringstream m;
    m.swap(std::stringstream());

    return 0;
}
Run Code Online (Sandbox Code Playgroud)

Kar*_*oll 1

std::swap函数需要两个非常量参数进行交换。这是因为调用函数时两个参数都会更改。类似地,该std::stringstream::swap(...)函数采用单个非常量参数进行交换。

例如:

std::vector<int> vec1, vec2;
std::swap(vec1, vec2);
Run Code Online (Sandbox Code Playgroud)

在上面的示例中, 和vec1vec2被更改。当你尝试这样做时...

m.swap(std::stringstream());
Run Code Online (Sandbox Code Playgroud)

...您试图将 的内容分配给临时的内容std::stringstream()m这对于编译器来说看起来像是一个错误,即使您的意图只是清除 的内容m

要消除警告,只需std::stringstream在执行交换之前声明一个临时变量即可。像这样:

std::stringstream temp;
m.swap(temp);
Run Code Online (Sandbox Code Playgroud)

  • 或者,先做临时的。`std::stringstream().swap(m);` (3认同)