Clarification needed for 18.6.4: terminate() and uncaught_excaption()
The question is regarding the behavior of the following program.
#include <cstdio>
#include <cstdlib>
#include <exception>
struct E {};
void t()
{
if (!std::uncaught_exception())
std::printf("HERE\n");
std::exit(0);
}
int main()
{
E e;
std::set_terminate(&t);
throw e;
}
Should it print "HERE"? This is the relevant part of the standard
(18.6.4, or for those looking at the working paper, 18.7.4):
bool uncaught_exception() throw();
Returns: true after completing evaluation of a
throw-expression until either completing
initialization of the exception-declaration in
the matching handler or entering unexpected()
due to the throw; or after entering terminate()
for any reason other than an explicit call to
terminate().
I can read this two ways:
1) Returns true after <blah> or after entering terminate() ...
2) Returns true after <blah> until either ... or after entering
terminate() ...
If I choose the second reading, the program should print "HERE". If I
choose the first, it shouldn't. What is the intention?
FWIW, the compilers I have available to me (metrowerks, visual c++, g++)
seem to agree with the second reading, but a well-respected conformance
testing suite interprets this the other way.
--
Eric Niebler
Boost Consulting
www.boost-consulting.com
The Astoria Seminar ==> http://www.astoriaseminar.com
---
[ comp.std.c++ is moderated. To submit articles, try just posting with ]
[ your news-reader. If that fails, use mailto:std-c++@ncar.ucar.edu ]
[ --- Please see the FAQ before posting. --- ]
[ FAQ: http://www.comeaucomputing.com/csc/faq.html ]