私はほとんど実用的な解決策を持っています。ただし、いくつかの単純なケースのコンパイルに失敗し、エラー メッセージを解読できません。
私の現在の解決策:
#define AUTO_RETURN( EXPR ) -> decltype( EXPR ) \
{ return EXPR; }
template< typename BinaryFunc, typename First, typename Second >
auto foldl( BinaryFunc&& func, First&& first, Second&& second )
AUTO_RETURN( func( std::forward<First>(first), std::forward<Second>(second) ) )
template<typename BinaryFunc, typename First, typename Second, typename... Rest >
auto foldl( BinaryFunc&& func, First&& first, Second&& second, Rest&&... rest )
AUTO_RETURN(
foldl(
std::forward<BinaryFunc>(func),
func( std::forward<First>(first), std::forward<Second>(second) ),
std::forward<Rest>(rest)... )
)
これは期待どおりに機能します:
struct adder
{
template< int LHS, int RHS >
std::integral_constant<int,LHS+RHS>
operator()( std::integral_constant<int,LHS>, std::integral_constant<int,RHS> )
{
return {};
}
};
auto result = foldl( adder(),
std::integral_constant<int,19>{},
std::integral_constant<int,23>{}
);
assert( result.value == 42 );
ただし、これはコンパイルに失敗します。
foldl( adder(),
std::integral_constant<int,1>{},
std::integral_constant<int,2>{},
std::integral_constant<int,3>{},
std::integral_constant<int,4>{},
);
std::forward
奇妙なことに、コードからすべての右辺値参照を削除すると、正常に動作します。
私は何を間違っていますか?
これはコンパイラのバグですか?