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

            Bug ID: 101960
           Summary: std::tuple with an array element is rejected as a
                    named return type
           Product: gcc
           Version: 11.0
            Status: UNCONFIRMED
          Severity: normal
          Priority: P3
         Component: libstdc++
          Assignee: unassigned at gcc dot gnu.org
          Reporter: wjwray at gmail dot com
  Target Milestone: ---

This fails to compile, going back many revisions, in any std version:
https://godbolt.org/z/Kz9Mnz9aW

    #include <tuple>

    std::tuple<int[1]> f() {
        std::tuple<int[1]> t;
        return t;
    }

GCC rejects with:    ​error: array used as initializer
Clang rejects with:  error: array initializer must be an initializer list

(The Compiler Explorer link shows it working in Clang+libc++ and MSVC.)

However, this works:

    std::tuple<int[1]> g() { return {}; }

and so does this (workaround: return by-reference, then copy):

    constexpr std::tuple<int[1]>& h(std::tuple<int[1]>&& t = {}) {
        return t;
    }
    constexpr auto t = h();

(The only way I find with libstdc++ to make a constexpr tuple<T[N]>)

Reply via email to