c++vectorpattern-matchingc++17structured-bindings

Does structured binding work with std::vector?


Is it possible to use structured binding with vectors?

E.g.

std::vector<int> vec{1, 2, 3};
auto [a, b, c] = vec;

Above code unfortunately doesn't work (under GCC), but maybe there's a different way (with structured binding) that allows to assign the first three values of a vector to three variables.


Solution

  • Structured binding only works if the structure is known at compile time. This is not the case for the vector.

    While you do know the structure of the individual elements, you do not know the number of elements, and that is what you are trying to decompose on in your question. Similarly, you can only use structured bindings on array types where the size is known at compile time. Consider:

    void f(std::array<int, 3> arr1,
           int (&arr2)[3],
           int (&arr3)[])
    {
        auto [a1,b1,c1] = arr1;
        auto [a2,b2,c2] = arr2;
        auto [a3,b3,c3] = arr3;
    }
    

    The first two will work, but the last line will fail to compile, because the size of arr3 is not known at compile time. Try it on godbolt.