...one of the most highly
regarded and expertly designed C++ library projects in the
world.
— Herb Sutter and Andrei
Alexandrescu, C++
Coding Standards
A ScopeExit declaration has the following synopsis:
#include <boost/scope_exit.hpp> BOOST_SCOPE_EXIT ( scope-exit-capture-list ) function-body BOOST_SCOPE_EXIT_END
where
scope-exit-capture-list: ( scope-exit-capture ) scope-exit-capture-list ( scope-exit-capture ) scope-exit-capture: identifier &identifier
The ScopeExit declaration schedules an execution
of scope-exit-body
at the end of the current scope. The scope-exit-body
statements are executed in the reverse
order of ScopeExit declarations in the given
scope. The scope must be local.
Each identifier
in scope-exit-capture-list
must
be a valid name in enclosing scope and it must appear exactly once in the list.
If a scope-exit-capture
starts with the ampersand sign &
,
the corresponding identifier
will be available inside scope-exit-body
; otherwise, a copy of it will be made
at the point of ScopeExit declaration and
that copy will be available inside scope-exit-body
. In the latter case, the idenitifer
must be CopyConstructible
.
Only identifiers listed in scope-exit-capture-list
, static variables, extern
variables and functions, and enumerations from the enclosing scope can be used
inside the scope-exit-body
.
Note | |
---|---|
|
The ScopeExit uses Boost.Typeof
to determine types of scope-exit-capture-list
elements. In order to compile code in
typeof emulation mode,
all types should be registered with BOOST_TYPEOF_REGISTER_TYPE
or BOOST_TYPEOF_REGISTER_TEMPLATE
macros, or appropriate Boost.Typeof
headers should be included.
This macro is a workaround for various versions of gcc. These compilers don't
compile ScopeExit declaration inside function
templates. As a workaround, the _TPL
suffix should be appended to BOOST_SCOPE_EXIT
.
The problem boils down to the following code:
template<class T> void foo(T const& t) { int i = 0; struct Local { typedef __typeof__(i) typeof_i; typedef __typeof__(t) typeof_t; }; typedef Local::typeof_i i_type; typedef Local::typeof_t t_type; } int main() { foo(0); }
This can be fixed by adding typename
in front of Local::typeof_i
and Local::typeof_t
.
See also GCC bug 37920.
Note | |
---|---|
Although |