【发布时间】:2013-05-09 18:06:47
【问题描述】:
在配置std::istringstream 以在设置failbit 时引发异常后,我没有发现libc++ 发生异常(这是在Linux 下,在libcxxrt 的支持下编译的libc++)。我想这是 libc++ 或 libcxxrt 中的一个错误:
#include <iostream>
#include <sstream>
template<typename T> std::istream &getvalue(std::istream &is, T &value, const T &default_value = T())
{
std::stringstream ss;
std::string s;
std::getline(is, s, ',');
ss << s;
if((ss >> value).fail())
value = default_value;
return is;
}
int main()
{
std::string s = "123,456,789";
std::istringstream is(s);
unsigned n;
try
{
is.exceptions(std::ios::failbit | std::ios::eofbit);
getvalue(is, n);
std::cout << n << std::endl;
getvalue(is, n);
std::cout << n << std::endl;
// Disable EOF exception on last bit
is.exceptions(std::ios::failbit);
getvalue(is, n);
std::cout << n << std::endl;
// Force Fail reading after EOF
getvalue(is, n);
std::cout << n << std::endl;
}
catch(std::ios::failure &fail)
{
std::cout << "Fail" << std::endl;
}
}
libstdc++ 的输出:
123
456
789
Fail
libc++/libcxxrt 输出:
123
456
789
0
编辑
也在 OS X 上测试过。
【问题讨论】:
-
你的编译选项中是否设置了
_LIBCPP_NO_EXCEPTIONS? -
@ecatmur,不,我没有设置它。
标签: c++ language-lawyer libc++