return one lambda expression back in place (related to f1eb5d2106)

This commit is contained in:
joaquintides
2022-10-07 11:27:54 +02:00
parent 5fc929b829
commit 74ca1e50f3

View File

@ -979,35 +979,19 @@ public:
static constexpr auto pocma=
alloc_traits::propagate_on_container_move_assignment::value;
/* Avoid using nested lambdas with a `this` capture as it seems to trigger
/* Avoid using nested lambdas with a `this` capture as it seems to trigger
* a bug in GCC:
* https://gcc.gnu.org/bugzilla/show_bug.cgi?id=80947
*
* Rather than directly attempting to manipulate the visibility of the
* table class, it's easier to work around the bug by simply un-nesting the
* lambdas
* lambda.
*/
auto const move_element=[this](value_type* p){
unchecked_insert(std::move(*p));
};
auto const elementwise_move=[&,this]{
reserve(x.size());
BOOST_TRY{
/* This works because subsequent x.clear() does not depend on the
* elements' values.
*/
x.for_all_elements(move_element);
}
BOOST_CATCH(...){
x.clear();
BOOST_RETHROW
}
BOOST_CATCH_END
x.clear();
};
if(this!=&x){
clear();
h()=std::move(x.h());
@ -1020,12 +1004,27 @@ public:
swap(arrays,x.arrays);
swap(ml,x.ml);
}
else if_constexpr<!alloc_traits::is_always_equal::value>(
else if_constexpr<!alloc_traits::is_always_equal::value>([&,this]{
/* The check above is redundant: we're setting up a compile-time
* barrier so that the compiler is convinced we're not throwing
* under noexcept(true) conditions.
*/
elementwise_move);
reserve(x.size());
BOOST_TRY{
/* This works because subsequent x.clear() does not depend on the
* elements' values.
*/
x.for_all_elements(move_element);
}
BOOST_CATCH(...){
x.clear();
BOOST_RETHROW
}
BOOST_CATCH_END
x.clear();
});
}
return *this;
}