forked from boostorg/unordered
return one lambda expression back in place (related to f1eb5d2106
)
This commit is contained in:
@ -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;
|
||||
}
|
||||
|
Reference in New Issue
Block a user