Re: Are throwing default constructors bad style, and if so, why?
Marsh Ray wrote:
On Sep 20, 8:47 pm, Andrei Alexandrescu
<SeeWebsiteForEm...@erdani.org> wrote:
Heck, if deque's constructor attempts to allocate memory (and
consequently throw), you can't even use the swap trick to ensure you
have completely emptied a deque.
Only if your code is depending on this not throwing, which is a small
minority of what I write in recent years.
So picture the irony: _emptying_ a
deque via the swap trick could _throw_. This is a correctness issue that
I guess simply rules the swap trick out as a method of emptying a
container in C++03.
I agree that it's ironic, but don't see how it's a general correctness
issue.
It's a correctness issue insofar as post-exception your container still
contains stuff it shouldn't. It may even be a general correctness issue
when thought from the perspective that voluntarily shrinking program
state size should not fail.
I gave up trying to track what throw and what doesn't, and have been
much happier for it. I assume nearly anything could throw (or later be
modified to), and tend to only try/catch around calls from C code,
destructors, and when there's the need to retry an operation.
That sounds good. However, if you want to ensure correctness of
multi-step operations, there must be certain steps that never throw. I
think that steps that relocate objects in memory or that swap objects
should not throw. With that guarantee in place, a good deal of solid
code can be written with relative ease.
Andrei
--
[ See http://www.gotw.ca/resources/clcm.htm for info about ]
[ comp.lang.c++.moderated. First time posters: Do this! ]