虽然libstdc ++没有,但libc ++确实遵循标准,该标准规定传递ios_base::failbit给basic_istream::exceptions格式化输入没有任何影响.例如这段代码:
istringstream is{"ASD"};
double foo;
is.exceptions(istream::failbit);
try {
is >> foo;
cout << foo << endl;
} catch(ios_base::failure& fail) {
cout << "ouch\n";
}
Run Code Online (Sandbox Code Playgroud)
会导致:
我对LWG2349的阅读是因为它basic_istream不会抛出任何格式化的输入.
例如,LWG2349建议对标准的27.7.2.3 [istream]/1进行更改,该标准引用了一个错误的失效,该错误会使libc ++行为像libstdc ++.更改以粗体显示,并在下面进行说明:
如果在输入期间抛出除抛出的异常
clear()(如果有的话)之外的异常,则ios::badbit在*this错误状态下打开.(抛出的异常如果basic_ios<>::clear()不会被捕获或重新抛出.)(exceptions()&badbit) != 0那么异常被重新抛出.
我明白这basic_istream::clear是对错误的格式化输入的反应,所以我误读了LWG2349还是实际上它会停止basic_istream抛出任何错误?
我不确定如何std::istream::exception 根据标准使用,std::istream::operator>>如果无法将输入读入变量,则抛出异常,例如double.以下代码与clang/libc ++和gcc/libstdc ++有不同的行为:
#include <iostream>
#include <cassert>
int main () {
double foo,bar;
std::istream& is = std::cin;
is.exceptions(std::istream::failbit);
is >> foo; //throws exception as expected with gcc/libstdc++ with input "ASD"
std::cout << foo;
is >> bar;
std::cout << bar;
assert(is); //failed with clang/libc++ after input "ASD"
std::cout << foo << " " << bar << std::endl;
}
Run Code Online (Sandbox Code Playgroud)
根据C++标准,是否is.exceptions(std::istream::failbit);适合operator>>抛出目的?