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

            Bug ID: 69384
           Summary: defaulted default constructor not defined as deleted
                    for class with a const data member which does not have
                    a user-provided default constructor
           Product: gcc
           Version: 5.2.1
            Status: UNCONFIRMED
          Severity: minor
          Priority: P3
         Component: c++
          Assignee: unassigned at gcc dot gnu.org
          Reporter: sensorflo at gmail dot com
  Target Milestone: ---

The standard (N4140) says in 12.1 p4: 

... A defaulted default constructor for class X is defined as deleted if:
...
(4.3) any non-variant non-static data member of const-qualified type (or array
thereof) with no brace-or-equal-initializer does not have a user-provided
default constructor, 

However the following compiles without error (g++ -std=c++14 -Wall -pedantic
main.cpp)

class A {  };
class B {
  const A a_;
};
int main() {
  B b{};
}

If I add a member to class A I rightfully get a compile error. I assume it's an
extension of gcc that it does not respect 12.1 p4.3 if the class type of the
const member has no non-static members, since in this case the intention of
12.1 p4.3 is not given. Still, using -pedantic I expect gcc to 'reject all
programs that use forbidden extensions'. I now have the portability problem
that gcc wrongly accepts my real world program, but other compilers rightfully
reject it.

Reply via email to