https://gcc.gnu.org/bugzilla/show_bug.cgi?id=121521

            Bug ID: 121521
           Summary: elements of std::array in constexpr structured binding
                    is not a constant expression
           Product: gcc
           Version: 16.0
            Status: UNCONFIRMED
          Severity: normal
          Priority: P3
         Component: c++
          Assignee: unassigned at gcc dot gnu.org
          Reporter: cooky.ykooc922 at gmail dot com
  Target Milestone: ---

#include <array>

struct Point {
    int x, y, z;
};

int main() {
    constexpr int arr[] {1, 2, 3};
    constexpr auto [a, b, c] = arr;

    constexpr std::array std_arr {4, 5, 6};
    constexpr auto [d, e, f] = std_arr; // error
    constexpr auto [g, h, i] = std::array{42, 91, 72}; // error

    constexpr auto [x, y, z] = Point {9, 0, -4};
}

>From the snippet of code above, constexpr structured bindings have no problems
with native arrays and aggregate types. But with std::array (has a member array
and uses the tuple protocol), the compiler rejects two lines:

<source>:12:32: error: '<structured bindings>.std::array<int, 3>::_M_elems[0]'
is not a constant expression
   12 |     constexpr auto [d, e, f] = std_arr; // error
      |                                ^~~~~~~
<source>:12:32: error: '<structured bindings>.std::array<int, 3>::_M_elems[1]'
is not a constant expression
<source>:12:32: error: '<structured bindings>.std::array<int, 3>::_M_elems[2]'
is not a constant expression
<source>:13:53: error: '<structured bindings>.std::array<int, 3>::_M_elems[0]'
is not a constant expression
   13 |     constexpr auto [g, h, i] = std::array{42, 91, 72}; // error
      |                                                     ^
<source>:13:53: error: '<structured bindings>.std::array<int, 3>::_M_elems[1]'
is not a constant expression
<source>:13:53: error: '<structured bindings>.std::array<int, 3>::_M_elems[2]'
is not a constant expression

Reply via email to