From 7e93021787f7ddd22464a38de46faaad2cd79629 Mon Sep 17 00:00:00 2001 From: khizmax Date: Sat, 7 Mar 2015 20:50:13 +0300 Subject: [PATCH] GCC-4.8 workaround for passing parameter pack to a lambda --- cds/container/bronson_avltree_map_rcu.h | 24 ++++++++++++------------ 1 file changed, 12 insertions(+), 12 deletions(-) diff --git a/cds/container/bronson_avltree_map_rcu.h b/cds/container/bronson_avltree_map_rcu.h index 25c7e5d9..eac4bf23 100644 --- a/cds/container/bronson_avltree_map_rcu.h +++ b/cds/container/bronson_avltree_map_rcu.h @@ -3,6 +3,7 @@ #ifndef CDSLIB_CONTAINER_BRONSON_AVLTREE_MAP_RCU_H #define CDSLIB_CONTAINER_BRONSON_AVLTREE_MAP_RCU_H +#include #include namespace cds { namespace container { @@ -236,10 +237,10 @@ namespace cds { namespace container { template bool emplace( K&& key, Args&&... args ) { - // gcc/clang error: https://gcc.gnu.org/bugzilla/show_bug.cgi?id=47226 - // see http://www.open-std.org/jtc1/sc22/wg21/docs/cwg_defects.html#904 - this is what we need +# if !( CDS_COMPILER == CDS_COMPILER_GCC && CDS_COMPILER_VERSION >= 40800 && CDS_COMPILER_VERSION < 40900 ) // Probably, the following code is not so efficient, since we pass lvalues instead rvalues to lambda //TODO: study how to pass a parameter pack to a lambda efficiently using perfect forwarding + // see http://www.open-std.org/jtc1/sc22/wg21/docs/cwg_defects.html#904 - this is what we need return base_class::do_update( key, key_comparator(), [&args...]( node_type * pNode ) -> mapped_type * { @@ -249,20 +250,19 @@ namespace cds { namespace container { }, update_flags::allow_insert ) == update_flags::result_inserted; -# if 0 - // another implementation (from http://stackoverflow.com/questions/14191989/how-do-i-use-variadic-perfect-forwarding-into-a-lambda) - // Does not work on vc12 - auto lambda = []( Args&&... args) -> mapped_type* { return cxx_allocator().New( std::forward(args)...); }; - auto helper = std::bind( - lambda, - std::forward(args)... - ); +# else + // gcc 4.8 error: https://gcc.gnu.org/bugzilla/show_bug.cgi?id=47226 + // workaround (from http://stackoverflow.com/questions/14191989/how-do-i-use-variadic-perfect-forwarding-into-a-lambda) + auto f = std::bind( + []( Args... args) -> mapped_type* { return cxx_allocator().New( std::move(args)...); }, + std::forward(args)... + ); return base_class::do_update( key, key_comparator(), - [&helper]( node_type * pNode ) -> mapped_type * + [&f]( node_type * pNode ) -> mapped_type * { assert( pNode->m_pValue.load( memory_model::memory_order_relaxed ) == nullptr ); CDS_UNUSED( pNode ); - return helper(); + return f(); }, update_flags::allow_insert ) == update_flags::result_inserted; -- 2.34.1