GCC 4.4.0 (and earlier) requires a copy constructor for elements that are not
explicitly initialized using a non-empty aggregate initializer list. Thus the
following fails

struct B { B() { } private: B(B const&); };
struct A { int a; B b; };

int main() { 
    A a = { 0 };
}

main.cpp: In function 'int main()':
main.cpp:1: error: 'B::B(const B&)' is private
main.cpp:5: error: within this context

The Standard says any not explicitly ininitialized element is
value-initialized. In the above sample, that should call the default
constructor. The copy constructor is required only when using an empty
aggregate initializer:


struct B { B() { } private: B(B const&); };
struct A { int a; B b; };

int main() { 
    A a = { };
}

In which case any element should be initialized from an expression of the form
T(), with T being the type of the element. GCC correctly rejects that example,
but incorrectly rejects the first example. 

Note that C++0x will make both examples valid (in the latest draft, at least),
and GCC should not reject any of them.


-- 
           Summary: Aggregate initialization requires copy constructor
           Product: gcc
           Version: 4.4.0
            Status: UNCONFIRMED
          Severity: normal
          Priority: P3
         Component: c++
        AssignedTo: unassigned at gcc dot gnu dot org
        ReportedBy: schaub-johannes at web dot de
  GCC host triplet: i686-pc-linux-gnu
GCC target triplet: i686-pc-linux-gnu


http://gcc.gnu.org/bugzilla/show_bug.cgi?id=40239

Reply via email to