Hi guys,

We're trying out the latest version of Boost (1.61, migrating from 1.55) and have some code calling the fusion library that now doesn't compile and it's not obvious (to me at least) why. I've created a simple program (below) to demonstrate the issue. As per the compile/run section below, this compiles and runs with Boost 1.55, not with 1.61. 

If anyone has any idea or pointers to what is wrong here I'd really appreciate it. Sorry if this isn't the right forum for this kind of issue too - if so please let me know how best to seek help on this.

Regards
Jess

******************** main.cpp 

#include <boost/fusion/algorithm/iteration/for_each.hpp>
#include <boost/fusion/view/zip_view.hpp>
#include <boost/fusion/tuple.hpp>

#include <iostream>
#include <string>

struct Helper
{
    template<typename Arg>
    void operator()(const Arg& arg) const
    {
        std::cout << boost::fusion::get<0>(arg) << std::endl; 
        std::cout << boost::fusion::get<1>(arg) << std::endl; 
    }
};
int main()
{

    const int myint(123);
    const double mydub(456.0);
    const std::string mystr("blah");
    const bool mybool(false);

    typedef boost::fusion::tuple<const int&, const double&> Tuple1;
    typedef boost::fusion::tuple<const std::string&, const bool&> Tuple2;
    typedef boost::fusion::tuple<const Tuple1&, const Tuple2&> Tuple3;
    
    Helper helper; 
    boost::fusion::for_each(
        boost::fusion::zip_view<Tuple3>(
            Tuple3(Tuple1(myint, mydub), Tuple2(mystr, mybool))),
        helper);

    return 0;
}

******************** compile/run tests

jess@flathead:~$ g++ --version
g++ (Ubuntu 5.3.1-14ubuntu2) 5.3.1 20160413
Copyright (C) 2015 Free Software Foundation, Inc.
This is free software; see the source for copying conditions.  There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.

(boost 1.55)
jess@flathead:~$ g++ -std=c++14 main.cpp 
jess@flathead:~$ ./a.out 
123
blah
456
0

(boost 1.61)
jess@flathead:~$ g++ -std=c++14 main.cpp 
In file included from /usr/local/include/boost/fusion/container/vector/vector10.hpp:25:0,
                 from /usr/local/include/boost/fusion/view/transform_view/transform_view.hpp:22,
                 from /usr/local/include/boost/fusion/algorithm/transformation/transform.hpp:11,
                 from /usr/local/include/boost/fusion/view/zip_view/detail/begin_impl.hpp:14,
                 from /usr/local/include/boost/fusion/view/zip_view/zip_view.hpp:16,
                 from /usr/local/include/boost/fusion/view/zip_view.hpp:12,
                 from main.cpp:2:
/usr/local/include/boost/fusion/container/vector/vector.hpp: In instantiation of ‘constexpr boost::fusion::vector_detail::vector_data<std::integer_sequence<long unsigned int, _Idx ...>, T ...>::vector_data(boost::fusion::vector_detail::each_elem, U&& ...) [with U = {const boost::fusion::tuple<const boost::fusion::tuple<const int&, const double&>&, const boost::fusion::tuple<const std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >&, const bool&>&>&}; long unsigned int ...I = {0ul, 1ul}; T = {const boost::fusion::tuple<const int&, const double&>&, const boost::fusion::tuple<const std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >&, const bool&>&}]’:
/usr/local/include/boost/fusion/container/vector/vector.hpp:305:97:   required from ‘boost::fusion::vector<T>::vector(U&& ...) [with U = {const boost::fusion::tuple<const boost::fusion::tuple<const int&, const double&>&, const boost::fusion::tuple<const std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >&, const bool&>&>&}; T = {const boost::fusion::tuple<const int&, const double&>&, const boost::fusion::tuple<const std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >&, const bool&>&}]’
/usr/local/include/boost/fusion/view/zip_view/zip_view.hpp:128:30:   required from ‘constexpr boost::fusion::zip_view<Sequences>::zip_view(const Sequences&) [with Sequences = boost::fusion::tuple<const boost::fusion::tuple<const int&, const double&>&, const boost::fusion::tuple<const std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >&, const bool&>&>]’
main.cpp:32:64:   required from here
/usr/local/include/boost/fusion/container/vector/vector.hpp:230:52: error: mismatched argument pack lengths while expanding ‘boost::fusion::vector_detail::store<I, T>’
                 : store<I, T>(std::forward<U>(var))...
                                                    ^
/usr/local/include/boost/fusion/container/vector/vector.hpp: In instantiation of ‘constexpr boost::fusion::vector_detail::store<<anonymous>, T>::store() [with long unsigned int <anonymous> = 0ul; T = const boost::fusion::tuple<const int&, const double&>&]’:
/usr/local/include/boost/fusion/container/vector/vector.hpp:230:52:   required from ‘constexpr boost::fusion::vector_detail::vector_data<std::integer_sequence<long unsigned int, _Idx ...>, T ...>::vector_data(boost::fusion::vector_detail::each_elem, U&& ...) [with U = {const boost::fusion::tuple<const boost::fusion::tuple<const int&, const double&>&, const boost::fusion::tuple<const std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >&, const bool&>&>&}; long unsigned int ...I = {0ul, 1ul}; T = {const boost::fusion::tuple<const int&, const double&>&, const boost::fusion::tuple<const std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >&, const bool&>&}]’
/usr/local/include/boost/fusion/container/vector/vector.hpp:305:97:   required from ‘boost::fusion::vector<T>::vector(U&& ...) [with U = {const boost::fusion::tuple<const boost::fusion::tuple<const int&, const double&>&, const boost::fusion::tuple<const std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >&, const bool&>&>&}; T = {const boost::fusion::tuple<const int&, const double&>&, const boost::fusion::tuple<const std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >&, const bool&>&}]’
/usr/local/include/boost/fusion/view/zip_view/zip_view.hpp:128:30:   required from ‘constexpr boost::fusion::zip_view<Sequences>::zip_view(const Sequences&) [with Sequences = boost::fusion::tuple<const boost::fusion::tuple<const int&, const double&>&, const boost::fusion::tuple<const std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >&, const bool&>&>]’
main.cpp:32:64:   required from here
/usr/local/include/boost/fusion/container/vector/vector.hpp:137:24: error: value-initialization of reference type ‘const boost::fusion::tuple<const int&, const double&>&’
                 : elem() // value-initialized explicitly
                        ^
/usr/local/include/boost/fusion/container/vector/vector.hpp: In instantiation of ‘constexpr boost::fusion::vector_detail::store<<anonymous>, T>::store() [with long unsigned int <anonymous> = 1ul; T = const boost::fusion::tuple<const std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >&, const bool&>&]’:
/usr/local/include/boost/fusion/container/vector/vector.hpp:230:52:   required from ‘constexpr boost::fusion::vector_detail::vector_data<std::integer_sequence<long unsigned int, _Idx ...>, T ...>::vector_data(boost::fusion::vector_detail::each_elem, U&& ...) [with U = {const boost::fusion::tuple<const boost::fusion::tuple<const int&, const double&>&, const boost::fusion::tuple<const std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >&, const bool&>&>&}; long unsigned int ...I = {0ul, 1ul}; T = {const boost::fusion::tuple<const int&, const double&>&, const boost::fusion::tuple<const std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >&, const bool&>&}]’
/usr/local/include/boost/fusion/container/vector/vector.hpp:305:97:   required from ‘boost::fusion::vector<T>::vector(U&& ...) [with U = {const boost::fusion::tuple<const boost::fusion::tuple<const int&, const double&>&, const boost::fusion::tuple<const std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >&, const bool&>&>&}; T = {const boost::fusion::tuple<const int&, const double&>&, const boost::fusion::tuple<const std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >&, const bool&>&}]’
/usr/local/include/boost/fusion/view/zip_view/zip_view.hpp:128:30:   required from ‘constexpr boost::fusion::zip_view<Sequences>::zip_view(const Sequences&) [with Sequences = boost::fusion::tuple<const boost::fusion::tuple<const int&, const double&>&, const boost::fusion::tuple<const std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >&, const bool&>&>]’
main.cpp:32:64:   required from here
/usr/local/include/boost/fusion/container/vector/vector.hpp:137:24: error: value-initialization of reference type ‘const boost::fusion::tuple<const std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >&, const bool&>&’