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

            Bug ID: 93790
           Summary: Cannot initialize reference from
                    std::reference_wrapper using direct- or
                    list-initialization syntax in GCC 10 c++2a mode
           Product: gcc
           Version: 10.0
            Status: UNCONFIRMED
          Severity: normal
          Priority: P3
         Component: c++
          Assignee: unassigned at gcc dot gnu.org
          Reporter: mkrupcale at matthewkrupcale dot com
  Target Milestone: ---

The following results in a compile error in GCC 10 -std=c++2a mode[1]:

=======================================
struct S {};
class S_refwrap {
    S& Sref_;
public:
    S_refwrap(S& Sref) : Sref_(Sref) {}
    operator S&() { return Sref_; }
};

S s;
S_refwrap s_rw(s);
S& s_r(s_rw);
=======================================

$ g++ --version
g++ (GCC) 10.0.1 20200216 (Red Hat 10.0.1-0.8)
$ g++ -std=c++2a -c /tmp/test1.cpp 
/tmp/test1.cpp:11:12: error: invalid initialization of non-const reference of
type ‘S&’ from an rvalue of type ‘<brace-enclosed initializer list>’
   11 | S& s_r(s_rw);
      |            ^

This does not result in an error in c++17 mode or with GCC 9.2 in c++2a mode.
However, using list-initialization with GCC 9.2 in c++2a mode does result in
the same error.

I originally encountered this when trying to initialize a reference from a
std::reference_wrapper using direct initialization. This also failed with
list-initialization but works with copy initialization (i.e. S& s_r = s_rw;).

The error with a constant reference is similar:
error: invalid initialization of reference of type ‘const S&’ from expression
of type ‘<brace-enclosed initializer list>’

This might be related to the following bugs:
https://gcc.gnu.org/bugzilla/show_bug.cgi?id=63604
https://gcc.gnu.org/bugzilla/show_bug.cgi?id=67259
https://gcc.gnu.org/bugzilla/show_bug.cgi?id=77875

[1] https://godbolt.org/z/4udMyJ

Reply via email to