, если вы хотите игнорировать «первый» элемент только тогда:
//li[position()>1]
or
(//a)[position()>1]
, если вы хотите только последнее (например, ваш пример):
//li[last()]
or
(//a)[last()]
Я думаю, что это ошибка в старом gcc. Более новые gcc и VS правильно отлавливают выданное исключение и устанавливают флаг плохого бита вместо распространения исключения через потоковые методы. Мусор печатается, потому что c
остается неинициализированным после неудачной попытки чтения. Вы можете сделать так, чтобы поток генерировал исключение битового бита, установив флаги исключений в потоке:
try
{
io::filtering_istream in;
in.exceptions(::std::ios_base::badbit | ::std::ios_base::failbit | ::std::ios_base::eofbit);
in.push(TestFilter());
in.push(source);
char c;
in >> c;
cout << c;
} catch (boost::exception& e) {
cout << "not expected boost exception";
return 1;
}
catch(::std::exception const & e)
{
cout << "Expected std exception";
return 2;
}
также см. Документация по исключениям iostream