Здравствуйте, _nn_, Вы писали:
__>Почему так не работает
[...skip...]
__>А так работает:
В выводе препроцессора видно, что всё сделано специально для того, чтобы сохранить ссылку на переменную.
Из такого кода:
#include <iostream>
#include <boost/scope_exit.hpp>
int main () {
int my_some_Variable = 42;
BOOST_SCOPE_EXIT ( ( my_some_Variable ) ) {
my_some_Variable = 128;
} BOOST_SCOPE_EXIT_END
}
получаем такой (g++, плохо вычищено):
| Скрытый текст |
| int main () {
int my_some_Variable = 42;
typedef void (*boost_se_tag_0_6)(int my_some_Variable);
typedef __typeof__(boost::type_of::ensure_obj(boost::scope_exit::aux::wrap( boost::scope_exit::aux::deref(my_some_Variable, (boost_se_tag_0_6)0)))) boost_se_wrapped_t_0_6;
typedef boost_se_wrapped_t_0_6::type boost_se_capture_t_0_6;
struct boost_se_params_t_6 {
typedef boost_se_capture_t_0_6 boost_se_param_t_0_6;
boost::scope_exit::aux::member< boost_se_param_t_0_6, boost_se_tag_0_6 > boost_se_param_0_6;
} boost_se_params_6 = {
{ boost::scope_exit::aux::deref(my_some_Variable, (boost_se_tag_0_6)0) }
};
boost::scope_exit::aux::declared< boost::scope_exit::aux::resolve< sizeof(boost_scope_exit_args)>::cmp1<0>::cmp2 > boost_scope_exit_args;
boost_scope_exit_args.value = &boost_se_params_6;
struct boost_se_guard_t_6 { boost_se_params_t_6* boost_se_params_;
boost_se_guard_t_6 (void* boost_se_params) : boost_se_params_( (boost_se_params_t_6*)boost_se_params) {} ~boost_se_guard_t_6() { boost_se_body( boost_se_params_->boost_se_param_0_6.value );
} static void boost_se_body( boost_se_params_t_6:: boost_se_param_t_0_6 my_some_Variable ) {
my_some_Variable = 128;
} } boost_se_guard_8 ( boost_scope_exit_args.value);
}
|
| |
Похоже, он (BOOST_SCOPE_EXIT) для таких целей (запуска без переменных) не предназначен
.
Можно, конечно, сделать простой велосипед:
#include <boost/preprocessor/cat.hpp>
#define LIGHT_SCOPE_EXIT \
struct BOOST_PP_CAT ( local_struct_, __LINE__ ) { \
BOOST_PP_CAT ( ~local_struct_, __LINE__ ) ()
#define LIGHT_SCOPE_EXIT_END \
} BOOST_PP_CAT ( local_struct_var_, __LINE__ ); static_cast<void> ( BOOST_PP_CAT ( local_struct_var_, __LINE__ ) );
#include <cstdio>
int main () {
LIGHT_SCOPE_EXIT {
puts ( "One" );
} LIGHT_SCOPE_EXIT_END;
LIGHT_SCOPE_EXIT {
puts ( "Two" );
} LIGHT_SCOPE_EXIT_END;
}