使用一行代码m.s swap(std::stringstream());清除stringstream
c++ Clear stringstream using one-liner m.swap(std::stringstream());?
我一直在使用以下代码清除std::stringstream
:
m.swap(std::stringstream());
代码可能取自这个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
在使用/W4的早期版本的Visual Studio中,我没有收到任何警告。我记得在早期的版本中,我在清除stringstreams时遇到了麻烦,这就是为什么我一开始就使用了这段代码。
那么用这种方式清除stringstream是可移植的吗?如果不是,你能解释为什么不这样做吗?也有一个便携式的方式来清除字符串流?由于
编辑:这是所要求的代码。使用/W4
编译它以查看警告。
int _tmain(int argc, _TCHAR* argv[])
{
std::stringstream m;
m.swap(std::stringstream());
return 0;
}
std::stringstream::swap()
的签名:
void swap( basic_stringstream& other );
可以看到,swap()
对其参数采用左值引用。正如编译器正确告诉您的那样,右值或临时值不能绑定到左值引用。有些编译器支持允许您这样做的非标准扩展,但我建议您保持在标准的范围内,这样更安全。
std::skipws
技巧将临时值转换为左值:
m.swap(static_cast<std::stringstream&>(stringstream{} >> std::skipws));
或者
std::stringstream{}.swap(m):
在第一个示例中,函数operator>>()
返回对流的引用,该引用与swap()
一起使用是安全的,因为保存实参的引用在函数结束时被销毁。
std::swap
函数接受两个非const形参进行交换。这是因为在调用函数时这两个参数都改变了。类似地,std::stringstream::swap(...)
函数接受一个非const形参进行交换。例如:
std::vector<int> vec1, vec2;
std::swap(vec1, vec2);
在上面的示例中,vec1
和vec2
都被改变了。当您尝试这样做时…
m.swap(std::stringstream());
…您试图将临时std::stringstream()
的内容与m
的内容赋值,即使您的意图只是清除m
的内容,对于编译器来说,这看起来像是一个错误。
要消除警告,只需在执行交换之前声明一个临时std::stringstream
。这样的:
std::stringstream temp;
m.swap(temp);
标准不允许使用swap
。声明为
template <typename CharT, typename Traits, typename Allocator>
void std::basic_stringstream<CharT, Traits, Allocator>::swap(
basic_stringstream& other);
意味着两个stringstream
对象都将被修改。但是表达式std::stringstream()
是一个右值(特别是一个临时值),并且c++不允许将非const左值引用绑定到临时值,因为修改临时值通常不是真正的目的。
简单的解决方案是:
m = std::stringstream();
但是如果你需要在不支持c++ 11的情况下支持编译器,这两种方法都行不通,因为在c++ 03标准中,stringstream
没有swap
函数,也没有公共的operator=
。在这种情况下,您需要使用:
m.clear();
m.str(std::string());
- 是否可以在 C++03 中定义'move-and-swap idiom'等效项
- 如何使 std::sort 在 std::swap 和我的命名空间的模板化交换之间没有名称冲突?
- 当我们进行一些操作时,应该使用什么'std::string'或'std::stringstream'?
- C ++中的StringStream有助于使用向量从字符串中提取逗号分隔的整数,而不是空格分隔的整数,为什么?
- 使用 "stringstream " 将字符串转换为整数
- std::stringstream 返回字符 *
- 我可以使用 std::vector::swap 来修改共享向量吗?
- Valgrind 在 std::string::swap 中报告 SIGILL
- 对函数的 out 字符串参数使用 swap 与赋值
- std::stringstream::flush() 应该做什么吗?
- 使用 std::vector::swap 方法在C++中交换两个不同的向量是否安全?
- 静态 std::stringstream 的叮当整警告
- a,b = b,a in python vs std::swap() in C++
- 使用 std::swap 禁用 ADL
- 如何使用 std::swap with array?
- Stringstream编译错误仅发生在linux环境中
- 为什么 std::swap 不适用于<bool> Clang/Win(英语:Clang/Win)下的矢量元素?
- "stringstream"复制构造它的字符串吗?
- 为什么"std::stringstream::stringstream(std::string&&)"不存在?
- 使用一行代码m.s swap(std::stringstream());清除stringstream