http://gcc.gnu.org/bugzilla/show_bug.cgi?id=50248
Bug #: 50248 Summary: gcc confused, tries to use variadic template to copy itself when it should use default constructor Classification: Unclassified Product: gcc Version: 4.6.0 Status: UNCONFIRMED Severity: normal Priority: P3 Component: c++ AssignedTo: unassig...@gcc.gnu.org ReportedBy: b.r.longb...@gmail.com Created attachment 25149 --> http://gcc.gnu.org/bugzilla/attachment.cgi?id=25149 far smaller example than the 30000 lines where I first encountered the bug GCC is trying to instantiate the variadic template as if to copy itself, but the only thing it should be doing is calling the default constructor. It only happens when it is constexpr and uses rvalue references. It only happens when it the parent class has a deleted copy constructor that takes a *nonconst* reference. 4.5.3 compiles it, but that's because it actually ignores the constexpr keyword. Known bad: 4.6.0, 4.6.1-4 debian, svn trunk as of 20110804 Workarounds: 1. Don't use rvalue references. 2. Add a fixed parameter before the variadic one. Error message: bug.cpp: In constructor 'constexpr earray<Elt, max>::earray(Elt2&& ...) [with Elt2 = {earray<short int, 11u>&}, Elt = short int, unsigned int max = 11u]': bug.cpp:25:30: instantiated from here bug.cpp:9:50: error: cannot convert 'earray<short int, 11u>' to 'short int' in initialization bug.cpp:9: confused by earlier errors, bailing out