From: khizmax Date: Sat, 7 Mar 2015 17:50:13 +0000 (+0300) Subject: GCC-4.8 workaround for passing parameter pack to a lambda X-Git-Tag: v2.1.0~305^2~17 X-Git-Url: http://demsky.eecs.uci.edu/git/?a=commitdiff_plain;h=7e93021787f7ddd22464a38de46faaad2cd79629;p=libcds.git GCC-4.8 workaround for passing parameter pack to a lambda --- 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;