从 istream 读取 bitset<0> 总是失败?



我最近在与std::bitset<0>一起工作,并注意到operator>>一些有趣的事情:

"规范"指出:

如果未提取任何字符,则调用 is.setstate(ios_base::failbit)。

当读取"所有可能的 N 个字符"(N == 0)时,这仍然适用吗?如果是这样,这是否意味着尝试从istream读取到bitset<0>必须始终设置failbit

以下单元测试在我手头的编译器中没有表现出一致的行为:

BOOST_AUTO_TEST_CASE(io0) {
try {
std::stringstream ss{"1"};
ss.exceptions(std::ios::badbit | std::ios::failbit);
std::bitset<0> b;
ss >> b;
BOOST_TEST(false);
} catch(...) {
BOOST_TEST(true);
}
}

MSVC 2019 设置了故障位,而 GCC 7.3.0 没有!

规范(没有吓人的引号)说了同样的事情(当这个问题被问到时),所以是的。 (当然,首先跳过空格可能会引发其他类型的失败。 我认为这是标准中的一个明显错误,所以我提出了一个问题,该问题已在 C++20 年得到解决。

最新更新