【发布时间】:2012-11-16 19:56:33
【问题描述】:
是否应该使用 std::ws 操纵器从流中提取失败位? 在以下代码中,Clang 编译的(在 Xcode 4.5.1 中)程序无法通过最终断言。显然,EOF 处的 s >> std::ws 会导致失败。然而 GCC 4.7.2 通过了这个断言。哪个是正确的?
#include <iostream>
#include <sstream>
#include <cassert>
int main(int argc, const char * argv[])
{
{
// Read string with trailing ws.
std::istringstream s( "test " );
std::string test;
s >> std::ws;
assert( !s.fail() ); // No ws to skip, but no failure.
s >> test;
assert( test == "test" );
assert( !s.fail() );
s >> std::ws;
assert( !s.fail() ); // No prob skipping trailing ws.
}
{
// Retry with no trailing ws.
std::istringstream s( "test" );
std::string test;
s >> std::ws;
assert( !s.fail() ); // No ws to skip, but no failure.
s >> test;
assert( test == "test" );
assert( !s.fail() );
s >> std::ws;
assert( !s.fail() ); // CLANG: Skipping absent ws at eof raises failbit.
}
return 0;
}
【问题讨论】:
-
对我来说 gcc 4.6、gcc 4.7 和 clang 3.1 都通过了每个断言
标签: c++ gcc clang iostream manipulators