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)
该std::swap函数需要两个非常量参数进行交换。这是因为调用函数时两个参数都会更改。类似地,该std::stringstream::swap(...)函数采用单个非常量参数进行交换。
例如:
std::vector<int> vec1, vec2;
std::swap(vec1, vec2);
Run Code Online (Sandbox Code Playgroud)
在上面的示例中, 和vec1都vec2被更改。当你尝试这样做时...
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)